第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么對(duì)于不能TriviallyCopyable的對(duì)象,std :: memcpy的行為將無法定義?

為什么對(duì)于不能TriviallyCopyable的對(duì)象,std :: memcpy的行為將無法定義?

來自http://en.cppreference.com/w/cpp/string/byte/memcpy:如果對(duì)象不是TriviallyCopyable(例如標(biāo)量,數(shù)組,C兼容結(jié)構(gòu)),則該行為是不確定的。在我的工作中,std::memcpy很長(zhǎng)時(shí)間以來,我們一直使用以下方法按位交換不可TriviallyCopyable的對(duì)象:void swapMemory(Entity* ePtr1, Entity* ePtr2){   static const int size = sizeof(Entity);    char swapBuffer[size];   memcpy(swapBuffer, ePtr1, size);   memcpy(ePtr1, ePtr2, size);   memcpy(ePtr2, swapBuffer, size);}從來沒有任何問題。我了解濫用std::memcpy非TriviallyCopyable對(duì)象并導(dǎo)致下游未定義行為是微不足道的。但是,我的問題是:std::memcpy與非TriviallyCopyable對(duì)象一起使用時(shí),為什么自身的行為不確定?為什么標(biāo)準(zhǔn)認(rèn)為有必要對(duì)此加以說明?更新針對(duì)此帖子和該帖子的答案,已修改了http://en.cppreference.com/w/cpp/string/byte/memcpy的內(nèi)容。當(dāng)前的描述是:如果對(duì)象不是TriviallyCopyable(例如標(biāo)量,數(shù)組,與C兼容的結(jié)構(gòu)),則除非程序不依賴于目標(biāo)對(duì)象的析構(gòu)函數(shù)的影響(不是由memcpy)運(yùn)行,否則行為是不確定的。目標(biāo)對(duì)象(以結(jié)束,但未以開頭memcpy)是通過其他某種方式(例如,新放置)來啟動(dòng)的。
查看完整描述

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。


查看完整回答
反對(duì) 回復(fù) 2019-10-30
?
慕絲7291255

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í)行。


查看完整回答
反對(duì) 回復(fù) 2019-10-30
  • 3 回答
  • 0 關(guān)注
  • 463 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)