ホームページ  >  記事  >  バックエンド開発  >  C では移動元ベクトルは常に空ですか?

C では移動元ベクトルは常に空ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-17 17:34:02537ブラウズ

Are Moved-From Vectors Always Empty in C  ?

移動元ベクトルの空性: オプションの探索

C プログラミングの領域では、ベクトルは汎用性の高いデータ構造であり、その目的によく利用されます。効率的なメモリ管理。ただし、移動元ベクトルの動作を理解しようとすると、プログラマはその空性に関する疑問に遭遇するかもしれません。

標準の定義と要件

C 標準では、一般的な定義が提供されています。 N3485 17.6.5.15 [lib.types.movedfrom]/1:

「C 標準ライブラリで定義された型のオブジェクトは移動される可能性がある」に記載されている、移動後のオブジェクトの動作に関するガイドラインfrom (12.8)。移動操作は明示的に指定することも、暗黙的に生成することもできます。別段の指定がない限り、そのような移動元オブジェクトは、有効ではあるが指定されていない状態に置かれます。"

この規定は、ベクトルを明示的に除外するものではありません。

移動コンストラクターの確認

ベクトルの移動コンストラクター、vector::vector (vector&& v) は、一定の複雑さを持つ必要があります。これにより、ソース ベクトル v から新しいベクトル *this へのリソースの転送が必要になり、v は空の状態になります。

移動の割り当てとアロケータの影響の調査

移動代入演算子、ベクトル& Vector::operator=(vector&& v) はより複雑で、ベクトルのアロケータの影響を受けます。 3 つのシナリオが現れます:

  1. アロケーター伝播が有効:
    allocator_traits::propagate_on_container_move_assignment::value が true の場合、移動代入演算子は要素とメモリの割り当てを解除し、転送します。 v から所有権を取得し、両方のベクトルを空のままにします。
  2. アロケータ伝播が無効 (同じアロケータ):
    前のケースと同様に、移動代入演算子はケース 1 に似ていますが、アロケータは保持されます。無傷。ただし、同じパターンに従い、空のベクトルが生成されます。
  3. アロケーター伝播が無効 (異なるアロケーター):
    この場合、移動割り当てではリソースを転送できず、移動が必要になります。要素を個別に。これには、要素の移動割り当てまたはコピー割り当ての機能が必要であり、移動元ベクトル v に移動元要素が含まれたままになる可能性があります。一部の実装では v を明示的にクリアすることを選択する場合がありますが、これは標準では必須ではありません。

結論

通常、ベクトルは移動元から空になりますが、アロケーターの動作と割り当て要素を移動またはコピーする機能によっては例外があります。実装では、移動元オブジェクトの一般要件に準拠している限り、さまざまなアプローチを自由に採用できます。プログラマが C アプリケーションでベクトルや移動セマンティクスを扱う場合、これらのシナリオを理解することが重要です。

以上がC では移動元ベクトルは常に空ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。