C 11 仕様では、ライブラリ関数を参照するものも含め、すべての配列の新しい式で不特定のオーバーヘッドが発生する可能性があると規定されています。演算子 new[](std::size_t, void*) およびその他の配置割り当て関数。このオーバーヘッドは new の呼び出しごとに変わる可能性があります。
次の例を考えてみましょう。
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
仕様によれば、new (バッファ) std::string[10] は演算子 new[ を呼び出します。 ](sizeof(std::string) * 10 y,buffer)、ここで、y は指定されていない非負のオーバーヘッド値です。 y > の場合0 の場合、事前に割り当てられたバッファが不足します。
標準から y オーバーヘッド値を正確に決定することはできません。したがって、プラットフォームの実装に関する特別な知識がない限り、演算子 new[](std::size_t, void* p) を使用することはお勧めできません。
配列の配置-new を pre で使用する必要がある場合は、 -割り当てられたバッファーを使用して、独自の配置配列の新しい関数を作成して、オーバーヘッドを動的にチェックできます。
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; } int main() { alignas(std::string) char buffer[100]; std::string* p = new(buffer, sizeof(buffer)) std::string[3]; }
配列のサイズを変更し、n の値を検査することで、次のことができます。プラットフォームの y オーバーヘッドを推定します。
以上がC 11 の配列配置 - 新しい式ではどのような不特定のオーバーヘッドが発生しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。