C++11的標準庫 <utility> 提供了一個非常有用的函式 std::move(),std::move() 函式將一個左值強制轉化為右值引用,以用於移動語義。
關於左值和右值的理解可以參考:C++中左值和右值的理解
移動語義,允許直接轉移物件的資產和屬性的所有權,而在引數為右值時無需複製它們。
換一種說法就是,std::move() 將物件的狀態或者所有權從一個物件轉移到另一個物件,只是轉移,沒有記憶體的搬遷或者記憶體複製。
因此,透過std::move(),可以避免不必要的複製操作。
比如建立一個臨時物件,傳遞給某個函式,這中間是有一次複製的。臨時物件複製到函數里的物件後,臨時物件就銷燬了。如果臨時物件裡有一些動態資源,也必須要複製一份。
但這是毫無意義的,因為臨時物件拷完就不用了,不如直接把臨時物件的資源掏出來直接使用。
這就需要區分臨時物件是否可以這樣使用,因為有些物件在其他地方也會被使用,不能隨意更改。右值引用就是讓函式知道是不是臨時物件的標記,這就是std::move()的作用。
比如下面這個例子,原str(lvalue值)被moved from之後值被轉移,所以變為空字串。
執行結果為:
若去掉std::move(),執行結果為:
std::move是為效能而生。std::move() 將物件的狀態或者所有權從一個物件轉移到另一個物件,只是轉移,沒有記憶體的搬遷或者記憶體複製,所以可以提高效率,改善效能。
C++11的標準庫 <utility> 提供了一個非常有用的函式 std::move(),std::move() 函式將一個左值強制轉化為右值引用,以用於移動語義。
關於左值和右值的理解可以參考:C++中左值和右值的理解
移動語義,允許直接轉移物件的資產和屬性的所有權,而在引數為右值時無需複製它們。
換一種說法就是,std::move() 將物件的狀態或者所有權從一個物件轉移到另一個物件,只是轉移,沒有記憶體的搬遷或者記憶體複製。
因此,透過std::move(),可以避免不必要的複製操作。
應用舉例比如建立一個臨時物件,傳遞給某個函式,這中間是有一次複製的。臨時物件複製到函數里的物件後,臨時物件就銷燬了。如果臨時物件裡有一些動態資源,也必須要複製一份。
但這是毫無意義的,因為臨時物件拷完就不用了,不如直接把臨時物件的資源掏出來直接使用。
這就需要區分臨時物件是否可以這樣使用,因為有些物件在其他地方也會被使用,不能隨意更改。右值引用就是讓函式知道是不是臨時物件的標記,這就是std::move()的作用。
比如下面這個例子,原str(lvalue值)被moved from之後值被轉移,所以變為空字串。
執行結果為:
若去掉std::move(),執行結果為:
std::move是為效能而生。std::move() 將物件的狀態或者所有權從一個物件轉移到另一個物件,只是轉移,沒有記憶體的搬遷或者記憶體複製,所以可以提高效率,改善效能。