首頁 >後端開發 >C++ >在 C 中使用 Placement-New 進行陣列分配時如何考慮開銷?

在 C 中使用 Placement-New 進行陣列分配時如何考慮開銷?

Barbara Streisand
Barbara Streisand原創
2024-12-12 14:12:10850瀏覽

How to Account for Overhead When Using Placement-New for Array Allocation in C  ?

陣列放置新:決定緩衝區中未指定的開銷

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn