Array Placement-New: バッファ割り当てにおけるオーバーヘッドの管理
C 11 標準では、placement-new を使用した配列割り当てが可能です。場所は手動で指定されます。ただし、割り当て中に、x および y で示される未指定のオーバーヘッド値がバッファ サイズに追加される場合があります。これにより、配列の配置-new を使用するときに事前に割り当てるメモリの量をどのように決定するかという問題が生じます。
5.3.4 [expr.new] で提供される標準的な例は、new(buffer) std を示しています。 :string[10] は内部で演算子 new[](sizeof(std::string) * 10 y,buffer) を呼び出します。これは、オーバーヘッド値 y がゼロでない場合、事前に割り当てられたバッファーが小さすぎる可能性があることを意味します。
修正: 標準配置関数のオーバーヘッドの削除
最近、標準を使用する際の不特定のオーバーヘッド y を排除する修正が導入されました (2019 年 11 月の欠陥レポート)。配置関数演算子 new[](std::size_t, void* p)。これは、この特定の配置関数のオーバーヘッドが一貫してゼロであることを意味します。
カスタム配置関数の影響
標準の配置関数ではオーバーヘッドが削除されていますが、カスタム配置関数を使用する場合には、潜在的な懸念が残ります。このような場合、特定のオーバーヘッド値に依存しないことが重要です。代わりに、実行時にオーバーヘッドを動的に決定できるカスタム配置配列 new 関数を実装することをお勧めします。
カスタム配置配列 new 関数の n の値を調べ、指定されたバッファ制限と比較することで、特定のプラットフォームのオーバーヘッドを推測し、それに応じてバッファ割り当てを調整できます。
結論
を使用する場合配列の配置が新しくなったため、カスタム配置関数に関連する潜在的なオーバーヘッドを認識することが重要です。実行時にオーバーヘッドを検出できるカスタム配置配列の新しい関数を実装すると、正しい量のメモリが割り当てられるようになり、潜在的な割り当てエラーが回避されます。
以上がC の Array Placement-new にはどのくらいのメモリを事前に割り当てる必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。