C++中的引用和移動語義


C++引用現在分為左值引用和右值引用。其實很好理解,左值引用中的左值指的就是能出現在等號左邊的值(帶名稱的變量,帶*號的指針等一類的數據),程序能對這樣的左值進行引用獲得其地址;右值引用中的右值指的就是出現在等號右邊的值(常量數字,或者函數的返回值(不能是左值引用類型),計算式的返回值等匿名不可訪問的數據),程序能對這樣的右值進行引用獲得其地址。也不知道對不對,反正可以簡單的理解為:能對其進行賦值操作的都是左值,不能對其進行賦值的都是右值。

引入右值引用的目的之一是實現移動語義。

移動語義的引入是為了解決在進行大數據復制的時候,將動態申請的內存空間的所有權直接轉讓出去,不用進行大量的數據移動,既節省空間又提高效率。要實現移動語義,就必須讓編譯器知道什么時候復制,什么時候移動語義,而這就是右值引用發揮作用的地方。移動語義可能修改右值的值,所以,右值引用參數不能是const。

通過構造復制構造函數和移動構造函數來實現復制和移動語義。復制構造使用const &引用,而移動構造函數使用非const && 引用。

被移動語義的數據交出了所有權,為了不出現析構兩次同一數據區,要將交出所有權的數據的指向動態申請內存去的指針賦值位nullptr,即空指針,對空指針執行delete[]是合法的。

編譯器判斷構造函數中是左值還是右值,然后調用相應的復制構造函數或者移動構造函數來構造數據。

強制移動,就是讓左值使用移動構造函數,強制讓其交出所有權。Utility文件中聲明,std::move()函數。

總結:利用匿名的變量,讓其交出所有權,避免復制數據,可以提高程序的效率,因此,如果一個臨時變量再也用不着了,可以讓其強制移動語義,這樣,程序不用再進行大量的數據復制了,尤其是在vector作為返回值的時候。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM