簡體   English   中英

使用移動語義:右值引用作為方法參數

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

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