移動コンストラクターはC ++でどのように機能しますか?

user7697718

私は(スタック上でも)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]

編集
0

コメントを追加

0

関連記事

分類Dev

C ++のコピーコンストラクターはどのように機能しますか?

分類Dev

GADTデータコンストラクター引数はIdrisでどのように機能しますか?

分類Dev

Laravelでコンストラクターの依存性注入はどのように機能しますか?

分類Dev

参照によるリターンはC ++クラスでどのように機能しますか?

分類Dev

このFlutterコンストラクター呼び出しはどのように機能しますか?

分類Dev

このコンストラクター呼び出しはどのように機能していますか?

分類Dev

C ++コピー、コンストラクターの移動

分類Dev

constコンストラクターは実際にどのように機能しますか?

分類Dev

1つの引数コンストラクターはどのように機能しますか?

分類Dev

Perlでの参照はどのように機能しますか

分類Dev

ThrowTerminationErrorはC#でどのように機能しますか?

分類Dev

文字列はCでどのように機能しますか?

分類Dev

scanf( "%[^:]]"、word)はCでどのように機能しますか

分類Dev

角括弧はCでどのように機能しますか?

分類Dev

例外はC ++でどのように機能しますか?

分類Dev

コンストラクタとデストラクタはどのように機能しますか?

分類Dev

c ++(なぜ)はコンストラクターを移動しますdelete operator =

分類Dev

コンバーターはSpringMVCでどのように機能しますか?

分類Dev

コンストラクターC ++ 11を移動します

分類Dev

Java 8配列コンストラクター参照はどのように機能しますか?

分類Dev

Ponyコンストラクターはどのように機能しますか?

分類Dev

javascriptコンストラクターはどのように機能しますか

分類Dev

SwiftではChangeChangeCharactersInRangeはどのように機能しますか?

分類Dev

Rubyでは `[] =`はどのように機能しますか?

分類Dev

コンパレータは内部でどのように機能しますか?

分類Dev

Conkyでvoffsetはどのように機能しますか?

分類Dev

resConfigsはAndroid(gradle)でどのように機能しますか?

分類Dev

Pythonで代入式 `:=`はどのように機能しますか?

分類Dev

Linuxでptraceはどのように機能しますか?

Related 関連記事

  1. 1

    C ++のコピーコンストラクターはどのように機能しますか?

  2. 2

    GADTデータコンストラクター引数はIdrisでどのように機能しますか?

  3. 3

    Laravelでコンストラクターの依存性注入はどのように機能しますか?

  4. 4

    参照によるリターンはC ++クラスでどのように機能しますか?

  5. 5

    このFlutterコンストラクター呼び出しはどのように機能しますか?

  6. 6

    このコンストラクター呼び出しはどのように機能していますか?

  7. 7

    C ++コピー、コンストラクターの移動

  8. 8

    constコンストラクターは実際にどのように機能しますか?

  9. 9

    1つの引数コンストラクターはどのように機能しますか?

  10. 10

    Perlでの参照はどのように機能しますか

  11. 11

    ThrowTerminationErrorはC#でどのように機能しますか?

  12. 12

    文字列はCでどのように機能しますか?

  13. 13

    scanf( "%[^:]]"、word)はCでどのように機能しますか

  14. 14

    角括弧はCでどのように機能しますか?

  15. 15

    例外はC ++でどのように機能しますか?

  16. 16

    コンストラクタとデストラクタはどのように機能しますか?

  17. 17

    c ++(なぜ)はコンストラクターを移動しますdelete operator =

  18. 18

    コンバーターはSpringMVCでどのように機能しますか?

  19. 19

    コンストラクターC ++ 11を移動します

  20. 20

    Java 8配列コンストラクター参照はどのように機能しますか?

  21. 21

    Ponyコンストラクターはどのように機能しますか?

  22. 22

    javascriptコンストラクターはどのように機能しますか

  23. 23

    SwiftではChangeChangeCharactersInRangeはどのように機能しますか?

  24. 24

    Rubyでは `[] =`はどのように機能しますか?

  25. 25

    コンパレータは内部でどのように機能しますか?

  26. 26

    Conkyでvoffsetはどのように機能しますか?

  27. 27

    resConfigsはAndroid(gradle)でどのように機能しますか?

  28. 28

    Pythonで代入式 `:=`はどのように機能しますか?

  29. 29

    Linuxでptraceはどのように機能しますか?

ホットタグ

アーカイブ