最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++之std::move移動(dòng)語(yǔ)義的具體實(shí)現(xiàn)

 更新時(shí)間:2026年07月01日 08:53:04   作者:流星雨愛(ài)編程  
本文圍繞C++11標(biāo)準(zhǔn)庫(kù)中的std::move函數(shù)展開(kāi),介紹了其功能是將左值引用強(qiáng)制轉(zhuǎn)化為右值引用以用于移動(dòng)語(yǔ)義,進(jìn)行了源碼分析,闡述了引用折疊規(guī)則,還說(shuō)明了其優(yōu)點(diǎn)是結(jié)合移動(dòng)構(gòu)造函數(shù)實(shí)現(xiàn)所有權(quán)轉(zhuǎn)移,提高代碼運(yùn)行效率

1.介紹

在C++11中,標(biāo)準(zhǔn)庫(kù)在中提供了一個(gè)有用的函數(shù)std::move,std::move并不能移動(dòng)任何東西,它唯一的功能是將一個(gè)左值引用強(qiáng)制轉(zhuǎn)化為右值引用,繼而可以通過(guò)右值引用使用該值,以用于移動(dòng)語(yǔ)義。

2.源碼分析

以VS2019為例,std::move原型定義:

template <class _Ty>
_NODISCARD constexpr remove_reference_t<_Ty>&& move(_Ty&& _Arg) noexcept { // forward _Arg as movable
    return static_cast<remove_reference_t<_Ty>&&>(_Arg);
}

remove_reference_t的定義如下:

template <class _Ty>
using remove_reference_t = typename remove_reference<_Ty>::type;

進(jìn)一步推導(dǎo)remove_reference的定義如下:

template <class _Ty>
struct remove_reference {     //原始的,最普通的版本
    using type                 = _Ty;
    using _Const_thru_ref_type = const _Ty;
};

template <class _Ty>
struct remove_reference<_Ty&> {   //左值引用
    using type                 = _Ty;
    using _Const_thru_ref_type = const _Ty&;
};

template <class _Ty>
struct remove_reference<_Ty&&> {  //右值引用
    using type                 = _Ty;
    using _Const_thru_ref_type = const _Ty&&;
};

首先,函數(shù)參數(shù)T&&是一個(gè)指向模板類(lèi)型參數(shù)的右值引用,通過(guò)引用折疊,此參數(shù)可以與任何類(lèi)型的實(shí)參匹配(可以傳遞左值或右值,這是std::move主要使用的兩種場(chǎng)景)。關(guān)于引用折疊如下:

1)所有右值引用折疊到右值引用上仍然是一個(gè)右值引用。(A&& && 變成 A&&) 。
2)所有的其他引用類(lèi)型之間的折疊都將變成左值引用。 (A& & 變成 A&; A& && 變成 A&; A&& & 變成 A&)。

簡(jiǎn)單來(lái)說(shuō),右值經(jīng)過(guò)T&&傳遞類(lèi)型保持不變還是右值,而左值經(jīng)過(guò)T&&變?yōu)槠胀ǖ淖笾狄谩?/p>

3.優(yōu)點(diǎn)

std::move將左值變?yōu)橛抑?,再結(jié)合類(lèi)的移動(dòng)構(gòu)造函數(shù),實(shí)現(xiàn)所有權(quán)從一個(gè)對(duì)象轉(zhuǎn)移到另一個(gè)對(duì)象,只是轉(zhuǎn)移,沒(méi)有內(nèi)存的搬遷或者內(nèi)存拷貝,從而極大地提高代碼運(yùn)行效率。

4.示例

    std::string old("12212412512");

	std::string new1 = std::move(old); //old變?yōu)?"

	std::unique_ptr<int>  pValue1(new int{ 5 });
	std::unique_ptr<int>  pValue2 = std::move(pValue1); //pValue1清空

	std::vector<int> pInts = { 0, 1, 2, 3, 4, 5, 67, 1000 };

	std::vector<int> pInt1 = pInts; //pInt1拷貝pInts,和pInts一樣

	std::vector<int> pInt2 = std::move(pInts); //pInts清空

到此這篇關(guān)于C++之std::move移動(dòng)語(yǔ)義的具體實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++ std::move移動(dòng)語(yǔ)義內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中類(lèi)的三種訪(fǎng)問(wèn)權(quán)限解析:private、public與protect

    C++中類(lèi)的三種訪(fǎng)問(wèn)權(quán)限解析:private、public與protect

    這篇文章主要介紹了C++中類(lèi)的三種訪(fǎng)問(wèn)權(quán)限解析:private、public與protect,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++實(shí)現(xiàn)高性能轉(zhuǎn)換大小寫(xiě)算法示例

    C++實(shí)現(xiàn)高性能轉(zhuǎn)換大小寫(xiě)算法示例

    大小寫(xiě)轉(zhuǎn)換是我們作為一名程序員經(jīng)常會(huì)遇到,也必須要會(huì)的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)高性能轉(zhuǎn)換大小寫(xiě)算法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2018-01-01
  • c++中std::hash以及萬(wàn)能hash的使用方式

    c++中std::hash以及萬(wàn)能hash的使用方式

    這篇文章主要介紹了c++中std::hash以及萬(wàn)能hash的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語(yǔ)言安全的進(jìn)行字符串拷貝的幾種方法

    C語(yǔ)言安全的進(jìn)行字符串拷貝的幾種方法

    在C語(yǔ)言編程中,字符串是通過(guò)定義char數(shù)組來(lái)保存,并通過(guò)指針以及字符串拷貝函數(shù)來(lái)實(shí)現(xiàn)字符串的拷貝,在字符串長(zhǎng)度不太明確的情況下,可能處出現(xiàn)拷貝越界的情況,給程序引入了不安全的因素,本篇就來(lái)討論下,在C語(yǔ)言中,如何安全的使用strcpy這類(lèi)函數(shù)進(jìn)行字符串的拷貝
    2026-06-06
  • 基于Protobuf C++ serialize到char*的實(shí)現(xiàn)方法分析

    基于Protobuf C++ serialize到char*的實(shí)現(xiàn)方法分析

    本篇文章是對(duì)Protobuf C++ serialize到char*的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • C語(yǔ)言 深入淺出講解指針的使用

    C語(yǔ)言 深入淺出講解指針的使用

    指針是C語(yǔ)言中一個(gè)非常重要的概念,也是C語(yǔ)言的特色之一。使用指針可以對(duì)復(fù)雜數(shù)據(jù)進(jìn)行處理,能對(duì)計(jì)算機(jī)的內(nèi)存分配進(jìn)行控制,在函數(shù)調(diào)用中使用指針還可以返回多個(gè)值
    2022-03-03
  • c++靜態(tài)局部變量和靜態(tài)函數(shù)示例

    c++靜態(tài)局部變量和靜態(tài)函數(shù)示例

    這篇文章主要介紹了c++靜態(tài)局部變量和靜態(tài)函數(shù)示例,需要的朋友可以參考下
    2014-04-04
  • Qt利用QPainter實(shí)現(xiàn)基本繪圖的示例詳解

    Qt利用QPainter實(shí)現(xiàn)基本繪圖的示例詳解

    Qt?中提供了強(qiáng)大的?2D?繪圖系統(tǒng),可以使用相同的?API?在屏幕和繪圖設(shè)備上進(jìn)行繪制,它主要基于QPainter、QPaintDevice?和?QPaintEngine?這三個(gè)類(lèi)。本文主要和大家介紹一下QPainter實(shí)現(xiàn)的基本繪圖,感興趣的可以了解一下
    2022-12-12
  • C++使用windwos?api實(shí)現(xiàn)獲取計(jì)算機(jī)基本信息

    C++使用windwos?api實(shí)現(xiàn)獲取計(jì)算機(jī)基本信息

    這篇文章主要為大家詳細(xì)介紹了C++如何使用windwos?api實(shí)現(xiàn)獲取windwos計(jì)算機(jī)的基本信息,包括計(jì)算機(jī)名稱(chēng)、操作系統(tǒng)版本、處理器信息等,需要的可以參考一下
    2023-04-04
  • mfc入門(mén)教程之通過(guò)控制變量制作計(jì)算器

    mfc入門(mén)教程之通過(guò)控制變量制作計(jì)算器

    這篇文章主要介紹了mfc入門(mén)教程之通過(guò)控制變量制作計(jì)算器,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04

最新評(píng)論

酉阳| 荣成市| 和政县| 全州县| 仙桃市| 枣强县| 永平县| 津市市| 方城县| 舟山市| 分宜县| 库尔勒市| 密山市| 宣威市| 泰州市| 南城县| 尉氏县| 安阳市| 黄大仙区| 惠东县| 淮北市| 临澧县| 澄城县| 额济纳旗| 肥东县| 进贤县| 邵阳县| 巴彦淖尔市| 汉川市| 胶州市| 乌恰县| 齐齐哈尔市| 周宁县| 泾源县| 六安市| 琼中| 杭锦旗| 日土县| 闽侯县| 平凉市| 伊宁县|