天天看點

C++11新特性(50)- 移動構造函數和移動指派

上一篇文章中,通過用移動string對象代替拷貝string對象,大大提高了程式的運作速度。其實對于我們自己寫的類也可以适用同樣的方式,前提是這些類實作了移動構造函數和移動指派運算符。

移動構造函數

首先看通常的拷貝構造函數:

C++11新特性(50)- 移動構造函數和移動指派

拷貝構造函數中實作了深拷貝處理。再看移動構造函數:

C++11新特性(50)- 移動構造函數和移動指派

代碼構造和拷貝構造函數類似,但是記憶體的處理不是拷貝而是轉移。注意參數類型是右值引用。

移動指派運算符

指派運算符的情況和構造函數類似,還是先考察普通的指派運算符:

C++11新特性(50)- 移動構造函數和移動指派

再看移動指派運算符:

C++11新特性(50)- 移動構造函數和移動指派

套路和普通的指派預算符相似,同樣是記憶體移動而不是拷貝。注意參數類型是右值引用。

使用執行個體

C++11新特性(50)- 移動構造函數和移動指派

和昨天同樣的測試思路,同樣的結果。使用移動方式操作時速度會大符提高。

例外

如果不定義移動構造函數而使用時,會出現錯誤

如果不定義移動指派運算符而使用時,雖然沒有編譯錯誤,但是可能會出現問題(本例中會發生記憶體管理混亂)

作者的一句話

這麼好的機制,如果不利用的話就浪費了。