2013-10-17 126 views
1

memmove和C++ 11 std::move有何區別?我可以在重疊的內存位置使用std::move嗎?哪種方法具有更高的速度性能?memmove和C++ 11 std :: move有什麼不同?

+0

std :: move實際上並沒有移動任何東西,而memmove卻是。 std :: move只是創建一個可以從中移動的右值引用。 –

+0

@Tom'std :: move'不會移動東西http://en.cppreference.com/w/cpp/algorithm/move,而'memmove'不會(它只是複製)! –

+0

@ R.MartinhoFernandes我的壞,我雖然他指的是其他[std :: move](http://en.cppreference.com/w/cpp/utility/move) –

回答

3

幾個方法:

  1. 的std ::移動調用構造函數/析構函數,而的memmove沒有。因此,memmove不適用於非POD類型。
  2. std :: move將適用於任何C++容器類型,而memmove只適用於在連續內存位置線性存儲元素(如數組和std :: vector)的元素。
  3. std :: move不適用於重疊左側源範圍的目標範圍(對此使用move_backwards),而memmove適用於所有重疊範圍。

在將POD類型複製到右重疊範圍的情況下,很可能memmove和std :: move將具有相似的性能。在其他所有情況下,只有其中一種是合適的,所以你不能真正比較性能。

+1

'std :: move'執行移動賦值,通常會調用移動賦值或複製賦值運算符。調用構造函數或析構函數的賦值運算符是可能的,但通常被認爲是不好的風格。您的評論的精神是正確的:'memmove'只是混洗字節,而'std :: move'尊重所涉及類型的特殊成員。調用構造函數/析構函數而不是賦值運算符的細節是不正確的。 –

相關問題