ホームページ > バックエンド開発 > C++ > 配置 - 新しい配列の割り当てには実際にどのくらいのオーバーヘッドがありますか?

配置 - 新しい配列の割り当てには実際にどのくらいのオーバーヘッドがありますか?

Mary-Kate Olsen
リリース: 2024-12-22 08:40:14
オリジナル
195 人が閲覧しました

How Much Overhead Does Placement-New Array Allocation Really Have?

Placement-New および未指定の配列割り当てオーバーヘッド

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート