[英]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
- 在函數中:2 s?
- 在功能中:2 s2
- 1秒1
- 2秒2
您在func中返回局部變量c。 它被構造成副本,然后被復制到b中。 您的副本構造函數指定s =“ s?” 這就是它的設定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.