簡體   English   中英

C ++返回值優化

[英]C++ Return Value Optimization

我是C ++的新手,我在Wiki和該網站上閱讀了一些關於收益優化的文章,但是我仍然很好奇以下行為是如何發生的:

using namespace std;
class A
{
    public:
        A()           {cout << "A Ctor" << endl;}
        A(const A &a) {cout << "A copy Ctor" << endl;}
};

A Foo()
{
    A a;
    return a;
}

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Foo()" << endl;
    Foo();
    cout << "Foo() and new object" << endl;
    A b(Foo());
    return 0;
}

輸出為:

Foo()
A Ctor
A copy Ctor
Foo() and new object
A Ctor
A copy Ctor

我的問題是,為什么Foo(); A b(Foo()); 都只觸發一個副本構造函數調用? 這是否意味着從Foo()返回的復制值可用於在該位置構造對象b ,從而無需再次調用b的構造函數? 這基於Visual Studio 2010。

返回值優化(RVO)指出編譯器可以刪除一個或兩個副本,但這不是必需的。 這意味着:

A a (Foo());

可以自由執行0、1或2個副本構造函數:

2-在函數Foo()中, A a創建一個A 當嘗試返回時,它將A復制到返回值中; 產生的初始化A a(Foo()); Foo()的結果復制到新的A

1-這些副本之一不會發生(可能是復制到Foo的返回值中的副本)。

0-這些副本均未發生。 A a創建的內部Foo直接變成A在此行中創建的: A a(Foo());

Msdn詳細介紹了可視c ++編譯器如何處理RVO 它有一些簡潔的代碼示例,說明了其有效工作方式。

暫無
暫無

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

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