在 C 中,placement-new 運算子允許直接在預先分配的記憶體中建構物件。當使用placement-new來分配數組時,必須考慮操作所產生的潛在的未指定開銷。
C 11標準規定placement-new表達式new(buffer) T[5]呼叫運算子 new[](sizeof(T)*5 y, buffer)。這裡,y 表示非負開銷值,該值會隨呼叫而變化。如果預先分配緩衝區的值大於零,則此開銷可能會影響預先分配緩衝區的大小。
考慮以下程式碼片段:
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
如果事先不知道 y,則很難確定為緩衝區分配適當的記憶體量。如果 y 大於零,則分配的緩衝區可能不足。
為了解決這個問題,標準最初將確定開銷的責任留給了實作細節。這種不確定性常常迫使開發人員避免使用運算子 new[](std::size_t, void* p) 或實作放置陣列新運算子來進行執行時間檢查。
更新
幸運的是,2019 年的一份缺陷報告通過修改標準來指定y 始終為零來糾正這個問題新[](std :: size_t,void * p)。此調整追溯適用於 C 的所有版本,提供一致且可預測的分配行為。
因此,當使用placement-new 直接在預先分配記憶體中分配陣列時,不再需要確定未指定的開銷。開發者可以安全地使用operator new[](std::size_t, void* p),而不用擔心超出緩衝區大小。
以上是在 C 中使用 Placement-New 進行陣列分配時如何考慮開銷?的詳細內容。更多資訊請關注PHP中文網其他相關文章!