ホームページ > バックエンド開発 > C++ > C 配置の新しい配列に実際に必要なバッファ領域はどれくらいですか?

C 配置の新しい配列に実際に必要なバッファ領域はどれくらいですか?

DDD
リリース: 2024-12-29 06:37:09
オリジナル
520 人が閲覧しました

How Much Buffer Space is Really Needed for C   Placement-New Arrays?

Array Placement-New: 不特定のオーバーヘッドの影響を理解する

C 標準では、Array Placement-New 式で不特定のオーバーヘッドが発生する可能性があることが義務付けられています。割り当てられたバッファ。変数 x と y で表されるこのオーバーヘッドは、new の呼び出しごとに異なります。

コード例を考えてみましょう。

void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
ログイン後にコピー

標準によれば、place-new 式 new (バッファ) std::string[10] は内部で演算子 new[](sizeof(std::string) * 10 y,

ただし、y が 0 より大きい場合、事前に割り当てられたバッファーが小さすぎる可能性があり、実行時エラーが発生する可能性があります。

方法必要なバッファ サイズを決定する

標準では、y が常に 0 になることが保証されません。事前に割り当てられたバッファで十分な場合は、必要な追加のオーバーヘッドを手動で計算できます。残念ながら、これにはプラットフォーム固有の実装の詳細に関する知識が必要です。

代替: 実装に依存しないアプローチ

実装固有の知識に依存しないようにするには、独自の配置配列実行時にオーバーヘッドをチェックする新しい実装:

inline
void*
operator new[](std::size_t n, void* p, std::size_t limit)
{
    if (n <= limit)
        std::cout << &quot;life is good\n&quot;;
    else
        throw std::bad_alloc();
    return p;
}
ログイン後にコピー

配列のサイズと上の例で n を検査すると、特定のプラットフォームの y の値を推測できます。

更新: オーバーヘッドの排除

Nicol Bolas は 11 月時点で次のことを強調しています。 2019 年、欠陥レポートによりこの問題が修正され、演算子 new[](std::size_t, void* p) の y が常に 0 になるようになりました。この変更は、C のすべてのバージョンに遡って適用されます。したがって、オーバーヘッドの見積もりは必要なくなりました。

以上がC 配置の新しい配列に実際に必要なバッファ領域はどれくらいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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