ホームページ >バックエンド開発 >C++ >C 11 の配列配置 - 新しい式ではどのような不特定のオーバーヘッドが発生しますか?

C 11 の配列配置 - 新しい式ではどのような不特定のオーバーヘッドが発生しますか?

DDD
DDDオリジナル
2024-12-13 19:07:14425ブラウズ

What Unspecified Overhead Do C  11 Array Placement-New Expressions Incur?

バッファー内の配列の配置 - 新しいオーバーヘッド

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。