C では、placement-new 演算子を使用して、事前に割り当てられたメモリ内にオブジェクトを直接構築できます。 place-new を使用して配列を割り当てる場合、操作によって発生する潜在的な不特定のオーバーヘッドを考慮することが重要です。
C 11 標準では、placement-new 式 new(buffer) T[5] が規定されています。演算子 new[](sizeof(T)*5 y, バッファ) を呼び出します。ここで、 y は、呼び出しごとに変化する非負のオーバーヘッド値を表します。このオーバーヘッドは、事前割り当てバッファーの値がゼロより大きい場合、そのサイズに影響を与える可能性があります。
次のコード スニペットを考えてみましょう。
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
y についての事前知識がなければ、それを判断するのは困難です。バッファに割り当てる適切なメモリ量。 y が 0 より大きい場合、割り当てられたバッファーが不十分である可能性があります。
この問題に対処するために、標準では当初、オーバーヘッドの決定の責任を実装の詳細に委ねていました。この不確実性により、開発者は演算子 new[](std::size_t, void* p) の使用を避けるか、実行時チェックのために配置 array-new 演算子を実装する必要が生じることがよくありました。
Update
幸いなことに、2019 年の欠陥レポートでは、演算子の y が常に 0 であることを指定するように標準を変更することで、この問題が修正されました。 new[](std::size_t, void* p)。この調整は C のすべてのバージョンに遡って適用され、一貫性のある予測可能な割り当て動作が提供されます。
したがって、place-new を使用して事前割り当てメモリに配列を直接割り当てるときに、未指定のオーバーヘッドを決定する必要はなくなりました。開発者は、バッファ サイズを超えることを心配することなく、演算子 new[](std::size_t, void* p) を安全に利用できます。
以上がC で配列割り当てに Placement-New を使用する場合のオーバーヘッドを考慮する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。