ホームページ > バックエンド開発 > C++ > C 11 の `std::vector::resize()` と Boost.Container の `resize()` は初期化されていない要素をどのように処理しますか?

C 11 の `std::vector::resize()` と Boost.Container の `resize()` は初期化されていない要素をどのように処理しますか?

Linda Hamilton
リリース: 2024-11-30 09:15:14
オリジナル
869 人が閲覧しました

How Do C  11's `std::vector::resize()` and Boost.Container's `resize()`  Handle Uninitialized Elements?

C 11 および Boost.Container でのベクターの動作: 初期化されていない要素の処理

C アプリケーションでは、ベクターは通常、一時バッファーとして使用されます。適切な容量を確保するために、これらのベクトルにはサイズ変更操作が行われることがよくあります。 C 03 では、 std::vector::resize() 関数は、指定された値のコピーを追加することによってベクトルを拡張します。このアプローチは未使用の要素を初期化しますが、ベクトル サイズのみが重要な場合は非効率的になる可能性があります。

C 11 では、resize() の 2 つのオーバーロードが導入されました:

  • resize(size_type n): 値を実行します。未使用の要素の初期化。
  • resize(size_type n, const value_type & val):指定された値のコピーを使用して未使用の要素を初期化します。

Boost.Container は、追加のオーバーロードでこの機能をさらに拡張します:

  • resize(size_type n,default_init_t):未使用の要素のデフォルトの初期化。

これらの関数の動作を確認するには、次のようにします。テストは C 11 std::vector T を使用して実施されました。そして boost::container::vector:

  1. 値 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] を持つ塗りつぶされたベクトル。
  2. 希望のサイズ [0、1、2、3、 4].
  3. さまざまな Resize() オーバーロードを使用して、ベクトルを 10 個の要素にサイズ変更しました。
  4. 更新されたベクトルを出力しました。

予想される動作

C 03の場合std::vector では、未使用の要素はゼロで初期化する必要があります。 boost::container のバリアントは、C 03 モードでコンパイルした場合には C 03 の動作をエミュレートし、C 11 モードでコンパイルした場合には異なる動作を示すことが期待されていました。

実際の結果

驚くべきことに、テスト結果では、std::vectorが両方とも正しいことが明らかになりました。そして boost::container::vector同じ挙動を示しました。すべての場合において、使用されているsize() オーバーロードに関係なく、未使用の要素はゼロで初期化されました。

説明

この予期しない動作は、resize() インターフェイスが無効であることを示唆しています。 C 11 で導入された変更は、特定のシナリオでは実際的な効果はありません。 C 03 std::vector::resize() 関数は、デフォルトで未使用の要素を初期化します。 C 11 では、resize() オーバーロードは明示的な初期化のための追加オプションを提供しますが、未使用の要素をデフォルトで初期化するデフォルトの動作は変更しません。同じ動作が Boost.Container 実装にも反映されます。

影響

未使用の要素をゼロで初期化することを避ける必要がある場合は、 std::allocator のconstruct() メソッドをインターセプトし、値の初期化をデフォルトの初期化に置き換えるカスタム アロケーターを使用できます。ただし、これをすべての初期化に適用すると、予期しない結果が生じる可能性があるため、慎重に作業を進めてください。

以上がC 11 の `std::vector::resize()` と Boost.Container の `resize()` は初期化されていない要素をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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