移動構造和移動賦值運算子

2021-09-19 12:21:42 字數 750 閱讀 4503

只是自動幫你呼叫析構。得自己確保寫對這個函式。比如把指標指向清0,讓移後源物件達到乙個安全的可析構狀態

strvec::strvec(strvec &&) noexcept:elements(s.elements), first_free(s.first_free), cap(s.cap)

容器要保證發生異常時物件沒有更改,即可以回退。

打個比方,vector的push_back操作可能會重新分配記憶體,可以用移動構造或拷貝構造。

移動元素的話會改變舊空間的元素,然後丟擲異常就會讓操作回不去了,這時vector裡亂套。即移動丟擲異常的話直接完蛋了。

而拷貝建構函式發生異常大不了清除新分配的空間。

如果想讓vector通過移動分配記憶體,就標記為noexcept來告訴編譯器可以安全使用。但是你咋知道安全呢?

如果顯式定義任何拷貝函式,就不會幫你預設定義移動了。

如果顯式定義任何移動函式,就不會幫你預設合成拷貝了。

當然還有好多種把合成移動定義成刪除的情況,不研究了。

不用管默不預設了,你敢用預設的嗎?

能用因為foo &&能轉化成 const foo&

C 移動建構函式和移動賦值運算子

c 11引入了物件移動而非拷貝的概念,有時候物件發生拷貝後就被銷毀了,這種情況下移動而非拷貝物件會大幅度提公升效能。移動建構函式類似於拷貝建構函式,不同的是移動建構函式的第乙個引數是乙個右值引用,移動建構函式僅僅移動資料成員,不會分配新的記憶體,所以比拷貝建構函式效能更好。移動賦值運算子與拷貝賦值運...

移動建構函式與移動賦值運算子

定義 新標準的乙個主要的特性是可以移動而不拷貝物件的能力,乙個典型的例子是在分配新記憶體的過程中,將元素從就舊記憶體拷貝到新記憶體中是不必要的 先拷貝元素,在釋放舊記憶體 再者,如果乙個類中含有io類和unique ptr類那麼只能使用移動建構函式 右值引用 定義 右值引用只能繫結到乙個即將銷毀的物...

物件移動,移動建構函式與移動賦值運算子

一 物件移動的概念 把乙個物件的所有權轉交給另乙個物件。完成必要的記憶體移動,斬斷原物件和記憶體的關係。二 移動建構函式 呼叫移動建構函式的情形 函式返回乙個物件時。include include using namespace std classa a a const a temp p new i...