使用「memcpy」建構普通可複製物件時的擔憂
在C 語言中,使用「memcpy」建構普通可複製對象的有效性可複製類型一直是爭論的話題。本文探討了圍繞此程式碼的細微差別和不確定性:
#include <cstdlib> #include <cstring> struct T // trivially copyable type { int x, y; }; int main() { void *buf = std::malloc( sizeof(T) ); if ( !buf ) return 0; T a{}; std::memcpy(buf, &a, sizeof a); T *b = static_cast<T *>(buf); b->x = b->y; free(buf); }
Uncertain Object Lifetime with "memcpy""
問題的關鍵在於確定是否「 *b" 表示一個生命週期已經啟動的對象,如果是,則表示該生命週期何時開始。C標準對此事保持沉默。 p0593,提倡在低階物件操作操作(例如「malloc」和「memcpy」)期間隱式物件建立。
C 14 標準草案的指南
根據C 14 標準草案第1.8 節[intro.object] ,物件主要是透過定義、new 表達式或某些實現過程創建的,與普通可複製類型相關的第3.9 節[basic.types] 指定允許複製此類物件的位元組,前提是適當地恢復這些值。郵件清單」促進了對此主題的熱烈討論,重點是透過類型雙關來避免複製。結論
使用「memcpy」「構造」普通可複製物件的問題在C 標準中仍未解決,為潛在的未定義行為留下了空間。中的低階物件操作帶來更大的確定性。以上是「memcpy」是在 C 中建構可簡單複製物件的有效方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!