在C 程式設計領域,使用像memcpy 這樣的位元複製方法建構普通可複製物件有引發了關於物件生命週期的爭論。問題出現了:下面程式碼中 b 指向的物件是否保證有明確定義的生命週期?
struct T { 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); }
未解決的問題
C儘管正在進行討論和提出建議,但標準在這個問題上仍然含糊不清。由於缺乏明確的指導,這個問題沒有得到解答,這對基於語義的分析工具、優化器和生命週期追蹤都有影響。
N3751 提案
N3751 建議識別 memcpy涉及不同的簡單可複製物件作為物件建構的操作,支援二進位 IO,同時保留生命週期分析功能。
C 14 標準
C 14 標準將物件建立定義為透過定義、新表達式或實作認為有必要時。目前語言沒有明確解決使用 memcpy 來建構物件的問題。
std::vector 實作
std::vector 的目前實作突顯了一個實際場景出現此問題時,會導致未定義的行為。
提案p0593:隱式物件建立
提案p0593 旨在透過明確定義隱式建立物件的場景來解決這種歧義,包括對malloc 和memcpy的調用。它提出了按需創建物件的機制,為程式提供定義的行為。然而,該提案仍在審查中。
結論
使用 memcpy 建構物件的狀態仍然是 C 社群中持續爭論的話題。在達成共識並更新標準之前,提供的範例之類的程式碼行為仍然未定義,可能會導致不可預測的程式行為。
以上是memcpy 在 C 中建構普通可複製物件嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!