C 11中的move語義減少了臨時物件和物件複製嗎?

時間 2021-06-03 21:07:58

1樓:槓吐血評論員陶某

move應該是針對你的物件中有在堆上分配記憶體這種情況而設定的,你舉的例子恰好不符合這種情況。看下面這個例子:

classA~

A()A(

A&&other)A

&operator=(

A&&other

)return

*this;}

int*p;

};int

main

A中有堆上分配的變數p時,呼叫move語義相關函式,只拷貝指標內容,不拷貝指標指向的記憶體的內容,

2樓:

對於不可避免物件複製的場合,move和copy沒有區別,你舉的例子就屬於這種情況。

對於大部分stl容器,move可以避免容器內部物件的複製,這時move相對於copy就有優勢了。

對move進行更深入的了解,推薦你讀一下中的Item29 "Assume that move operations are not present, not cheap, and not used."以及Item23 "Understand std::move and std::

forward."

C 11 的move語義,從語言功能正交性來看,是一種必須的語義嗎?

圓形畢露 Move語意不是必須的,它的作用是為了提高程式效率。Move語意和右值有關,在C 11中,編譯器能夠根據函式引數是左值還是右值決定呼叫copy constructor還是move constructor。右值從狹義上說就是沒有identity的表示式,比如匿名物件,通過隱式轉換的物件.這些...

c 11中 auto 定義的引用為什麼不能繫結字面值?

劉雲賓 編譯器認為,8 的型別是 int 因為非類非陣列的純右值沒有 CV 屬性 所以,它會推導為 int ay 8 這顯然是錯誤的。非類非陣列的純右值不能有cv 限定。注意 函式呼叫或轉型表示式可能生成非類的 cv 限定型別的純右值,但其 cv 限定符被立即剝除。值類別 cppreference....

在C 11中,auto關鍵字的大量使用,會影響編譯速度嗎?

原子筆 沒有測試就別隨便下結論或者杞人憂天吧。編譯器在處理XX a b時,不管XX是auto還是非auto 一樣要去檢視b的型別的,並且需要確認可以拷貝構造。所以理論上來講只會減少編譯時間,包括非自定義型別也類似。 Premature optimization is the root of all ...