3 回答

TA貢獻2003條經驗 獲得超2個贊
構造一個memcpy基于該類swap中斷的類很容易:
struct X {
int x;
int* px; // invariant: always points to x
X() : x(), px(&x) {}
X(X const& b) : x(b.x), px(&x) {}
X& operator=(X const& b) { x = b.x; return *this; }
};
memcpy這樣的對象破壞了不變性。
GNU C ++ 11 std::string正是使用短字符串來做到這一點。
這類似于標準文件和字符串流的實現方式。最終從中獲得流,std::basic_ios其中包含指向的指針std::basic_streambuf。流還包含作為該指針指向的成員(或基類子對象)的特定緩沖區std::basic_ios。

TA貢獻1859條經驗 獲得超6個贊
因為標準是這樣說的。
編譯器可能會假定非TriviallyCopyable類型僅通過其復制/移動構造函數/賦值運算符進行復制。這可能是出于優化目的(如果某些數據是私有的,則可以將其設置推遲到復制/移動發生之前)。
編譯器甚至可以自由地接聽您的memcpy
電話,使其無所事事,或格式化硬盤。為什么?因為標準是這樣說的。而且無所事事肯定比移動位快得多,那么為什么不優化您的程序memcpy
來使它同樣有效呢?
現在,在實踐中,當您只對不需要的類型的位進行四處查找時,可能會發生許多問題。虛擬功能表可能未正確設置。用于檢測泄漏的儀器可能未正確安裝。身份包括其位置的對象將完全被您的代碼弄亂。
真正有趣的部分是,對于編譯器可復制的類型,using std::swap; swap(*ePtr1, *ePtr2);
應該可以將其編譯memcpy
為,對于其他類型,則應定義行為。如果編譯器可以證明副本只是被復制的位,則可以將其更改為memcpy
。而且,如果您可以編寫更優化的代碼swap
,則可以在相關對象的名稱空間中執行。
添加回答
舉報