2013-09-05 29 views
1

在C++ 11移動語義之前,如果有一個需要重新分配的緩衝區,例如在一個std :: vector實現中,對push_back的調用導致重新分配,那麼只需memcpy舊緩衝區即可內容到新緩衝區中,還是應該遍歷舊緩衝區並將每個元素複製到新緩衝區中?memcpy在緩衝區重新分配中可以嗎?

回答

4

使用std::copy,它應該像編譯器編寫器允許的那樣完全優化。

3

移動語義不會神奇地使對象memcpy成爲可能。例如:

struct S { 
    S(int ii) : i(ii), ip(&i) { } 
    int i; 
    int *ip; // points to i 
}; 

當這種類型的一個對象被複制或移動,的ip副本中的值不能從原始對象中的值;必須將其更改爲指向新對象的i成員。 memcpy不是得到這個權利;它會將舊地址複製到新對象中,結果將是無意義的。複製構造函數和移動構造函數必須正確設置ip

正如@markransom所說,使用std::copy。它會得到正確的語義。特別是對於可以用memcpy複製的類型,它(通常)會這樣做。

相關問題