![](/img/trans.png)
[英]constructor inefficiency for cases when an object is returned from a function by value
[英]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.