C++中move的使用及說明
C++ move使用
move作用主要可以將一個左值轉(zhuǎn)換成右值引用,從而可以調(diào)用C++11右值引用的拷貝構(gòu)造函數(shù),在對象拷貝的時候,在運(yùn)行時,它們不會產(chǎn)生一行代碼原先的對象也會清空, 可以減少資源創(chuàng)建和釋放。
作為可以歸納為以下幾點(diǎn)
1、std::move函數(shù)可以以非常簡單的方式將左值引用轉(zhuǎn)換為右值引用。
2、通過std::move,可以避免不必要的拷貝操作。
3、std::move是為性能而生。
4、std::move是將對象的狀態(tài)或者所有權(quán)從一個對象轉(zhuǎn)移到另一個對象,只是轉(zhuǎn)移,沒有內(nèi)存的搬遷或者內(nèi)存拷貝。
兩個地址是獨(dú)立的,move操作實(shí)際上是系統(tǒng)將這一塊地址屬于哪一個地址的登記改一下,實(shí)際上這一塊內(nèi)存根本沒有發(fā)生任何變化。
打個比方,就好比說一個房產(chǎn),原來登記在張三名下,“張三”就是地址。張三也有管理權(quán)。move就相當(dāng)于過戶。過戶給李四后,“李四”就是這個房子的“地址”,管理權(quán)自然也交接給了李四。

C++move函數(shù)詳解
C++11的一個最重要特性就是支持移動語義,其中一個比較關(guān)鍵的函數(shù)就是 std::move 那這個函數(shù)的作用是什么?
首先打開庫文件 找到move的定義:

注意:不要把&&理解成引用的引用,這就是一個關(guān)鍵字
大概函數(shù)如下:
template<class T>
remove_reference_t<T>&& move(T && a) noexcept
{
return static_cast<remove_reference_t<T>&&>(arg);
}說白了這個函數(shù)的作用就是把傳進(jìn)來的參數(shù)強(qiáng)制轉(zhuǎn)換成右值引用
可能有些人會有疑問,
為什么參數(shù)已經(jīng)是右值引用了?
這就要說到參數(shù)推導(dǎo)了比如以下例子:
template<typename T> void foo(T&& params);
如果傳進(jìn)來的是一個左值
int a = 10; foo(a);
此時params被推導(dǎo)為int& 如果傳進(jìn)來的是一個右值
foo(20);
此時paramas被推導(dǎo)為int&&
remove_reference的作用是什么?
就是去掉引用,比如int& 變成int int&&變成 int
也就是說std::move把你傳進(jìn)來的參數(shù)所有的引用都去掉,然后在加上&&,也就是變成右值引用
remove_reference是怎么實(shí)現(xiàn)的?
非常簡單,首先看看定義:

可以看到有了三個模板匹配,不管你傳的是什么,我都能去掉你的引用,通過::type得到你原始的類型

其中remove_referenct_t 無非是一個方便的寫法 typename是為了說明 remove_reference是一個class
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
VC基于ADO技術(shù)訪問數(shù)據(jù)庫的方法
這篇文章主要介紹了VC基于ADO技術(shù)訪問數(shù)據(jù)庫的方法,較為詳細(xì)的分析了VC使用ADO操作數(shù)據(jù)庫的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10
C語言通過二分查找實(shí)現(xiàn)猜數(shù)字游戲
這篇文章主要為大家詳細(xì)介紹了在C語言中如何通過二分查找思想編寫一個簡單的猜數(shù)字游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02

