Array Placement-New: 不特定のオーバーヘッドの影響を理解する
C 標準では、Array Placement-New 式で不特定のオーバーヘッドが発生する可能性があることが義務付けられています。割り当てられたバッファ。変数 x と y で表されるこのオーバーヘッドは、new の呼び出しごとに異なります。
コード例を考えてみましょう。
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
標準によれば、place-new 式 new (バッファ) std::string[10] は内部で演算子 new[](sizeof(std::string) * 10 y,
ただし、y が 0 より大きい場合、事前に割り当てられたバッファーが小さすぎる可能性があり、実行時エラーが発生する可能性があります。
方法必要なバッファ サイズを決定する
標準では、y が常に 0 になることが保証されません。事前に割り当てられたバッファで十分な場合は、必要な追加のオーバーヘッドを手動で計算できます。残念ながら、これにはプラットフォーム固有の実装の詳細に関する知識が必要です。
代替: 実装に依存しないアプローチ
実装固有の知識に依存しないようにするには、独自の配置配列実行時にオーバーヘッドをチェックする新しい実装:
inline void* operator new[](std::size_t n, void* p, std::size_t limit) { if (n <= limit) std::cout << "life is good\n"; else throw std::bad_alloc(); return p; }
配列のサイズと上の例で n を検査すると、特定のプラットフォームの y の値を推測できます。
更新: オーバーヘッドの排除
Nicol Bolas は 11 月時点で次のことを強調しています。 2019 年、欠陥レポートによりこの問題が修正され、演算子 new[](std::size_t, void* p) の y が常に 0 になるようになりました。この変更は、C のすべてのバージョンに遡って適用されます。したがって、オーバーヘッドの見積もりは必要なくなりました。
以上がC 配置の新しい配列に実際に必要なバッファ領域はどれくらいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。