簡體   English   中英

函數值返回的對象的地址

[英]Address of an object returned by value from a function

考慮以下最小代碼:

class MyClass {
    public:
    MyClass() {}
};

MyClass myfunc() {
    MyClass obj;
    cout << "Address of obj in myFunc " << &obj << endl;
    return obj;
}

int main() {
    MyClass obj(myfunc());
    cout << "Address of obj in main   " << &obj << endl;
    return 0;
}

我獲得以下輸出:

Address of obj in myFunc 0x7fff345037df
Address of obj in main   0x7fff3450380f

現在,只需在MyClass中添加析構函數,我就得到以下輸出:

Address of obj in myFunc 0x7fffb6aed7ef
Address of obj in main   0x7fffb6aed7ef

顯示兩個對象現在都是一樣的......這只是巧合嗎?!

此外,究竟發生了什么:

MyClass obj(myfunc());

我已經重載了復制構造函數來打印消息,但它從未出現......

通過添加析構函數(無論您實際執行的是什么,您都沒有顯示代碼),行為已更改為使用返回值優化 (稱為RVO)。

然后將指向調用者存儲的指針傳遞給該函數,並且該函數直接在該存儲器中構造該對象,而不是例如復制處理器寄存器或寄存器組中的值。

在沒有RVO的情況下,也可以使用具有隱藏結果存儲指針的相同調用約定。 如果沒有RVO,則在功能結束時執行復制或移動。 該標准在某些條件下支持RVO優化,但是,雖然可以合理地預期,但編譯器沒有義務執行RVO。

暫無
暫無

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

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