ホームページ > バックエンド開発 > C++ > C 11 の `std::vector::resize()` インターフェイスは、新しい要素を効果的に値初期化するように変更されますか?

C 11 の `std::vector::resize()` インターフェイスは、新しい要素を効果的に値初期化するように変更されますか?

DDD
リリース: 2024-12-26 14:11:14
オリジナル
413 人が閲覧しました

Does C  11's `std::vector::resize()` Interface Change Effectively Value-Initialize New Elements?

std::vector::resize() と Boost.Container のsize() の動作を調査する

C 03 では、std::vector: :resize() は、提供された値のコピーを使用して、新しく割り当てられた要素を初期化しました。 C 11 では、値の初期化またはコピーによる初期化を可能にするオーバーロードが導入されました。

C 11 と同様の 3 つの Resize() オーバーロードをサポートする Boost.Container の Vector を使用して、動作を検証するテストが実施されました。 C 03 モードでは、std::vector と Boost.Container のベクトルは両方とも期待どおりに動作し、新しい要素をゼロで初期化しました。

ただし、C 11 モードでは、std::vector と Boost.Container のベクトルは両方とも初期化されたままです。値の初期化を目的としたオーバーロードを使用する場合、ゼロを含む新しい要素。これにより、次のような疑問が生じます:

C 11 std::vector::resize() インターフェイスの変更は実際に効果的ですか?

結果は、インターフェイスの変更が意図した効果をもたらしていないことを示唆しています。新しい要素は両方でまだ初期化中です

補遺

既存のアロケーターの制限に対処するために、代わりのアロケーター アダプターが提案されています。これは、値の初期化を実現するためのより安全で信頼性の高い方法を提供します。すべてのタイプの要素の初期化:

template <typename T, typename A=std::allocator<T>>
class default_init_allocator : public A {
  // ... implementation
};
ログイン後にコピー

このアダプターは、construct() 呼び出しに割り込みます。 value-initialization を実行し、それらをデフォルト初期化呼び出しに変換します。また、デフォルトの初期化も正しく処理されます。

以上がC 11 の `std::vector::resize()` インターフェイスは、新しい要素を効果的に値初期化するように変更されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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