簡體   English   中英

為什么調用移動構造函數而不是復制構造函數

[英]Why move constructor is called instead of copy constructor

我試圖了解移動構造函數,

通常在復制對象時調用復制構造函數

當我不提供move構造函數時會發生什么,

但是當我添加一個移動構造函數時,它會被調用,而不是我的復制構造函數,

這是我的代碼:

#include <iostream>
#include <vector>

using namespace std;

struct A
{
    A()
    {
        cout << "A's constructor" << endl;
    }

    A(const A& rhs)
    {
        cout << "A's copy constructor" << endl;
    }

    A(A&& rhs)
    {
        cout << "A's move constructor" << endl;
    }
};

int main() {

    vector<A> v;

    cout << "==> push_back A():";
    v.push_back(A());

    cout << "==> push_back A():" << endl;
    v.push_back(A());

    return 0;
}

編譯器是否會嘗試優化我的代碼並選擇更好的方法?

基本上是。

但是,這與編譯器優化無關,而與語言本身的優化方式無關。

移動語義的一半要點是允許有效使用臨時對象。 這就是為什么臨時變量綁定到右值引用,這就是整個move語義工作原理的原因。 當您沒有臨時人員但仍希望移動某些內容時,可以編寫std::move以獲取右值並觸發相同的行為。

無論如何,復制這些臨時文件是沒有意義的。

與復制/移動省略配合使用時,此功能將減少冗余計算。

但是請注意,您的move構造函數並不是非常有用-如果您想使其實際執行某些操作(例如um, 移動內容),則必須刪除該const

與常量左值引用相比,右值引用更適合綁定臨時對象。 它不是關於優化 (如在編譯器優化中),而是關於遵循標准。 實際的優化是根本不調用副本構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM