ホームページ > バックエンド開発 > C++ > C 11 の `std::vector::resize()` と Boost.Container の `boost::container::vector::resize()` は常に期待どおりに値を初期化しますか?

C 11 の `std::vector::resize()` と Boost.Container の `boost::container::vector::resize()` は常に期待どおりに値を初期化しますか?

DDD
リリース: 2024-12-09 08:07:06
オリジナル
688 人が閲覧しました

Does C  11's `std::vector::resize()` and Boost.Container's `boost::container::vector::resize()` Always Value-Initialize as Expected?

C 11 および Boost.Container の Vector::resize() は期待どおりに動作しますか?

C 03 では、std:: Vector::resize() 関数には、新しい要素を特定の値で初期化できるオーバーロードが 1 つだけありました。 C 11 では、2 つのオーバーロードが導入されました。値の初期化には、resize(size_type n)、コピーの初期化には、resize(size_type n, const value_type &val) です。

Boost.Container の boost::container::vector も、値の初期化をサポートしています。そのsize()メソッド内で。ただし、C 11 の std::vector と Boost.Container の boost::container::vector の両方の動作をテストした後、ベクトルに追加された最後の要素は、意図的にはゼロで初期化されたままであることが観察されました。値の初期化。

期待される値の理解動作:

値の初期化は、新しい要素がデフォルト値 (整数の場合は 0 など) で初期化されることを意味し、コピー初期化は、新しい要素が指定された値のコピーで初期化されることを意味します。

テスト結果:

次のコードは次の目的で使用されました。動作をテストします:

C 03 モードでのコンパイル:

C 03 モードでの出力は期待どおりです。 std_vec および boost_vec の新しい要素はゼロで初期化されますが、boost_vec_default の要素はデフォルトで初期化されます。

C 11 モードでのコンパイル:

ただし、C での出力は11 モードでは、std_vec と boost_vec の両方の新しい要素がまだ初期化中であることが示されています。ゼロ。これは、resize(size_type n) の予期された動作が満たされていないことを示します。

説明:

この予期しない動作の理由は、コンパイラが最適化を行っている可能性があることです。 size() の値初期化オーバーロードの呼び出しを終了します。値の初期化を強制するには、construct() メソッドをオーバーライドして値の初期化を明示的に実行するアロケーターを使用できます。

以上がC 11 の `std::vector::resize()` と Boost.Container の `boost::container::vector::resize()` は常に期待どおりに値を初期化しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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