C 11 標準では、placement-new 式 new(buffer) T[5] の呼び出しが発生することが指定されていますto 演算子 new[](sizeof(T)*5 y,buffer) ここで、x と y は配列割り当てを表す負ではない不特定の値です。
ただし、事前に割り当てられたバッファーで placement-new を使用する場合、これにより懸念が生じます。 y が 0 より大きい場合、割り当てられたバッファーは配列を収容できるほど大きくない可能性があります。
標準では y の値が保証されていないため、これは非常に重要です実行時に決定します。 1 つのアプローチは、使用可能なバッファー領域をチェックするカスタムの place-new 演算子を作成することです。
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; }
配列のサイズを変更し、カスタム new 演算子の n を検査することで、y の値を推測できます。
2019 年 11 月に欠陥レポートによってこの問題が修正されたことに注意することが重要です。 C のすべてのバージョンに遡って適用されます。更新された標準によると、演算子 new[](std::size_t, void* p) のオーバーヘッドは常にゼロです。
したがって、ライブラリ関数を使用する場合、演算子 new[](std::size_t, void*) を使用すると、不特定の割り当てオーバーヘッドを心配することなく、正確なサイズでバッファを事前に割り当てることができます。
以上が配置 - 新しい配列の割り当てには実際にどのくらいのオーバーヘッドがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。