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