[英]Using move semantics: rvalue reference as a method parameter
我想再次檢查我對移動語義的理解。 我的推理中是否遺漏了什么:
#include <iostream>
using std::cout;
struct A
{
A() {cout<<"Constructor\n";}
~A() {cout<<"Desctuctor\n";}
A(const A&) {cout<<"Copy Constructor\n";}
A(A&&) noexcept {cout<<"Move Constructor\n";}
int x{1};
};
int f1(A a)
{
cout<<"f1(A a)\n";
return a.x;
}
int f2 (A&& a)
{
cout<<"f2 (A&& a)\n";
return a.x;
}
int main()
{
A a1, a2;
f1(std::move(a1));
f2(std::move(a2));
}
Output:
Constructor
Constructor
Move Constructor
f1(A a)
Desctuctor
f2 (A&& a)
Desctuctor
Desctuctor
從我可以看到的f2()
,我沒有創建任何額外的副本,甚至是“輕”移動副本,這很酷。 所以我現在的理解是,如果我要使用移動語義,我最好總是編寫函數/方法簽名來接受 r 值,以避免任何不必要的復制。 還是我還缺少其他東西?
您幾乎總是最好只接受您將按價值保留的輸入(除了具有非常高移動成本的奇數類型)。
它保持相同水平的性能(在常見場景中)並使您的代碼非常易於理解。 它還非常清楚地表明您的代碼保留了該值(因為它保證會被移出),因為右值引用不會強制執行這一點。
如您所見,刪除打印語句后,您的示例的時序和生成的代碼是相同的: http://quick-bench.com/ADU4fzd0ISk0UrLboVhC-Pd7RmI
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.