回覆列表
  • 1 # 使用者9923191605008

    C++11的標準庫 <utility> 提供了一個非常有用的函式 std::move(),std::move() 函式將一個左值強制轉化為右值引用,以用於移動語義。

    關於左值和右值的理解可以參考:C++中左值和右值的理解

    移動語義,允許直接轉移物件的資產和屬性的所有權,而在引數為右值時無需複製它們。

    換一種說法就是,std::move() 將物件的狀態或者所有權從一個物件轉移到另一個物件,只是轉移,沒有記憶體的搬遷或者記憶體複製。

    因此,透過std::move(),可以避免不必要的複製操作。

    應用舉例

    比如建立一個臨時物件,傳遞給某個函式,這中間是有一次複製的。臨時物件複製到函數里的物件後,臨時物件就銷燬了。如果臨時物件裡有一些動態資源,也必須要複製一份。

    但這是毫無意義的,因為臨時物件拷完就不用了,不如直接把臨時物件的資源掏出來直接使用。

    這就需要區分臨時物件是否可以這樣使用,因為有些物件在其他地方也會被使用,不能隨意更改。右值引用就是讓函式知道是不是臨時物件的標記,這就是std::move()的作用。

    比如下面這個例子,原str(lvalue值)被moved from之後值被轉移,所以變為空字串。

    執行結果為:

    若去掉std::move(),執行結果為:

    std::move是為效能而生。std::move() 將物件的狀態或者所有權從一個物件轉移到另一個物件,只是轉移,沒有記憶體的搬遷或者記憶體複製,所以可以提高效率,改善效能。

  • 中秋節和大豐收的關聯?
  • 人生只有一次懂得珍惜的句子?