3 回答

TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
構(gòu)造一個(gè)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這樣的對(duì)象破壞了不變性。
GNU C ++ 11 std::string正是使用短字符串來做到這一點(diǎn)。
這類似于標(biāo)準(zhǔn)文件和字符串流的實(shí)現(xiàn)方式。最終從中獲得流,std::basic_ios其中包含指向的指針std::basic_streambuf。流還包含作為該指針指向的成員(或基類子對(duì)象)的特定緩沖區(qū)std::basic_ios。

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