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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

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

3 回答

?
湖上湖

TA貢獻2003條經(jīng)驗 獲得超2個贊

構(gòu)造一個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正是使用短字符串來做到這一點。


這類似于標(biāo)準(zhǔn)文件和字符串流的實現(xiàn)方式。最終從中獲得流,std::basic_ios其中包含指向的指針std::basic_streambuf。流還包含作為該指針指向的成員(或基類子對象)的特定緩沖區(qū)std::basic_ios。


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

TA貢獻1859條經(jīng)驗 獲得超6個贊

因為標(biāo)準(zhǔn)是這樣說的。

編譯器可能會假定非TriviallyCopyable類型僅通過其復(fù)制/移動構(gòu)造函數(shù)/賦值運算符進行復(fù)制。這可能是出于優(yōu)化目的(如果某些數(shù)據(jù)是私有的,則可以將其設(shè)置推遲到復(fù)制/移動發(fā)生之前)。

編譯器甚至可以自由地接聽您的memcpy電話,使其無所事事,或格式化硬盤。為什么?因為標(biāo)準(zhǔn)是這樣說的。而且無所事事肯定比移動位快得多,那么為什么不優(yōu)化您的程序memcpy來使它同樣有效呢?

現(xiàn)在,在實踐中,當(dāng)您只對不需要的類型的位進行四處查找時,可能會發(fā)生許多問題。虛擬功能表可能未正確設(shè)置。用于檢測泄漏的儀器可能未正確安裝。身份包括其位置的對象將完全被您的代碼弄亂。

真正有趣的部分是,對于編譯器可復(fù)制的類型,using std::swap; swap(*ePtr1, *ePtr2);應(yīng)該可以將其編譯memcpy為,對于其他類型,則應(yīng)定義行為。如果編譯器可以證明副本只是被復(fù)制的位,則可以將其更改為memcpy。而且,如果您可以編寫更優(yōu)化的代碼swap,則可以在相關(guān)對象的名稱空間中執(zhí)行。


查看完整回答
反對 回復(fù) 2019-10-30
  • 3 回答
  • 0 關(guān)注
  • 472 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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