簡體   English   中英

為什么在這段代碼中沒有得到返回值優化?

[英]why don't I get return value optimization in this code?

誰能向我解釋輸出的第五行? 我不明白為什么MyClass對象b不能從func分配返回的對象c

class MyClass
{
public:
    int x;
    std::string s;

    MyClass(const MyClass &other);
    MyClass();
    void output();
};

MyClass::MyClass(const MyClass &other): x(2), s("s?") { }
MyClass::MyClass() : x(1), s("s1") { }

void MyClass::output() { cout << x << " " << s << endl; }

MyClass func(MyClass c) //MyClass c = Myclass(a)
{
    cout << "2. in func: "; c.output();
    c.s = "s2";
    cout << "3. in func: "; c.output();
    return c;
}

int main() 
{
    MyClass a;
    cout << "1. "; a.output();
    MyClass b = func(a);
    cout << "4. "; a.output();  
    cout << "5. "; b.output();
}

輸出為:

1. 1 s1
2. in func: 2 s?
3. in func: 2 s2
4. 1 s1
5. 2 s?

我知道第1-4行是從哪里來的,但我不明白為什么MyClass bs的值最終是s? 不是s2 是因為const對象是在func范圍內創建的?

編輯:我知道在func范圍內初始化MyClass c對象時會調用復制構造func ,但是如何將返回的對象不分配給b

MyClass b = func(a);

該行將調用MyClass的副本構造函數從a創建b 盡管它具有= ,但它不會調用賦值運算符; 該對象尚未創建,因此沒有要分配的內容。

對象不需要是const即可綁定到const T& ,即使臨時對象也可以綁定到它們。

為什么在這段代碼中沒有得到返回值優化?

原因是您的函數返回的是c ,這是一個參數。 即使它是一個值,因此也是函數中的局部對象,這也是C ++標准不允許返回值優化 (在這種情況下, 稱為返回值優化或NRVO)的情況之一。 如果要創建c的本地副本,將允許RVO:

MyClass func(MyClass c) //MyClass c = Myclass(a)
{
    MyClass d = c;
    cout << "2. in func: "; d.output();
    d.s = "s2";
    cout << "3. in func: "; d.output();
    return d;
}

進行了這些更改后,我使用了最近的clang ++獲得了以下內容:

  1. 1秒1
  2. 在函數中:2 s?
  3. 在功能中:2 s2
  4. 1秒1
  5. 2秒2

您在func中返回局部變量c。 它被構造成副本,然后被復制到b中。 您的副本構造函數指定s =“ s?” 這就是它的設定。

暫無
暫無

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

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