[英]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.