C++之std::move移動(dòng)語(yǔ)義的具體實(shí)現(xià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,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
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的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
基于Protobuf C++ serialize到char*的實(shí)現(xiàn)方法分析
本篇文章是對(duì)Protobuf C++ serialize到char*的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05
c++靜態(tài)局部變量和靜態(tài)函數(shù)示例
這篇文章主要介紹了c++靜態(tài)局部變量和靜態(tài)函數(shù)示例,需要的朋友可以參考下2014-04-04
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ī)基本信息
這篇文章主要為大家詳細(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ì)算器,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04

