クラスの標準のコピー代入演算子では、代入されたオブジェクトがif (this != &rhs) を使用して呼び出し元オブジェクトの変更を避けるのと同じです。しかし、このチェックは移動代入演算子に必要ですか?
operator=(Class&&) で示される移動代入演算子は、リソースの所有権を効率的に転送するように設計されています。あるオブジェクトから別のオブジェクトへ。コピーの割り当てとは異なり、オブジェクトの新しいコピーを作成する必要がなくなります。
Can this == &rhs?
これ == &rhs が移動代入で true になり得るかどうかという疑問が生じます。演算子。
オブジェクトが右辺値参照にバインドされる場合、次の 2 つのシナリオがあります。
最初のケースでは、オブジェクトは一時オブジェクトへの一意の参照であるため、オブジェクトでは、これ == &rhs は不可能です。 2 番目のケースでは、this != &rhs であることを確認するのは呼び出し側の責任であり、チェックが不要になります。
著者は、if (this != &rhs) チェックは次の理由により冗長です:
このチェックを省略すると、オブジェクトが頻繁に移動されたり割り当てられたりする状況でパフォーマンスを向上させることができます。
しかし、 this != が正しいと主張する人もいます。 &rhs チェックは、自己移動割り当てを防ぐために依然として必要です。彼らは、swap(x, x) を有効な操作として許可すると、このチェックがトリガーされる可能性があると主張しています。
著者は次のように結論付けています。
コピーして移動の割り当て事後条件:
Self-Move-Assignment 実装:
これを実現するには、次のようなクラスでの移動代入演算子の 3 つの実装が考えられます。 Dam_array が提供されます:
1. チェック自己移動割り当てを区別するために実行され、続行する前にオブジェクトが有効な状態に設定されます。
2. チェックインが省略され、自己移動割り当てが no- になります。 op.
3. クラスが必要なリソースを保持していない場合、swap(other) メソッドが使用されます。すぐに解放されます。
著者は、最適な実装は特定のクラス設計、ハードウェア特性、およびパフォーマンス要件に依存すると強調しています。
クラスがメモリを直接管理しない場合は、operator=(Class& を使用することを推奨しています。 &) = デフォルト;基本的な例外安全性を備えた最高のパフォーマンスを実現します。
以上が移動代入演算子に「if (this != &rhs)」チェックは必要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。