私は(スタック上でも)moveコンストラクターに関する多くの記事を読みましたが、これがどのように機能するかについての正確な説明はどこにも見つかりませんでした(一時オブジェクトへのポインターの転送と、この一時変数とそのアドレスが会ったときに破棄される場合の保存方法) ")")。
これが簡単な例です
#include <iostream>
#include <vector>
using namespace std;
class boVector {
private:
int size;
public:
boVector() {};
boVector(const boVector& rhs) { cout << "copy Ctor." << endl; }
boVector(boVector&& rhs) { cout << "move Ctor." << endl; }
};
void foo(boVector v) {}
boVector createBoVector() { return boVector(); }
int main()
{
//copy
boVector reausable = createBoVector();
foo(reausable);
//move
foo(std::move(createBoVector()));
return 0;
}
ムーブCtorは、浅いコピーコピーまたは単なるポインター割り当てであると言われています。しかし、一時オブジェクトへのポインタを使用してオブジェクトを開始するにはどうすればよいですか(このオブジェクトが破棄されると、オブジェクトは不明なアドレスを指し、これは私の観点からは無効です)。
「)」に出会った後に存在しなくなるポインタアドレスで変数を開始するのは正しくありません。
誰かが私にこの一時変数がメモリ内でどのように見えるか、そして一時オブジェクトのアドレスを現在のオブジェクトに割り当て、この操作を有効なものにする方法を説明してもらえますか?
「moveコンストラクター」は魔法のようなものではありません。右辺値参照を受け取るコンストラクターです。
右辺値参照は一時オブジェクトにバインドされ、期限切れが近づいていて、プログラムの後半でアクセスされないものの「意味」を持ちます。これにより、開発者は、ポインタースワップなどの観点からリソース保持クラスの移動を実装できます。高速操作。
あなたのboVector
それだけで保存するように、クラスは本当に、動きの意味から任意の利点を取ることができないint
と任意のリソースを保持していません。の移動int
は、コピーと同じくらい高速です。
の中に
foo(std::move(createBoVector()));
式は、すでに右辺値であるためstd::move
冗長です。createBoVector()
考えてみましょう:
foo(createBoVector());
boVector(boVector&&)
よりも一致するため、これが呼び出されboVector(const boVector&)
ます。
によって作成されたインスタンスcreateBoVector()
は、式の全期間にわたって存続します。これは、右辺値参照がの期間中、有効なオブジェクトを指していることを意味しますboVector(boVector&&)
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加