[C++] 函數(shù)怎樣返回一個對象——返回值優(yōu)化初識

f(){
...
return ret;
}
main:
A a=f();
沒有任何的對象的移動,返回值優(yōu)化,不把f的返回值放在f堆棧上,直接使用a的地址來存放返回值ret的對象。
可以產(chǎn)生的優(yōu)化結果:類似f被inline了,沒有多余的對象被產(chǎn)生,沒有多余的對象的搬運產(chǎn)生,所有復制過程都消除。


此時構造ret的地址就是構造a的地址,沒產(chǎn)生單獨的ret對象,且沒調用任何拷貝搬運構造函數(shù)。

構造兩個返回對象,對象在兩個地址上,最終返回的時候,需要把其中的一個對象移動到a的地址上去,移動構造發(fā)生的地址就是a的地址,在過程中需要調用一個移動構造函數(shù),原因是我們不知道到一是要把ret1還是ret2放在最后返回的a的地址上去。

比之前多了一次調用移動構造函數(shù),原因是沒有辦法在一開始決定把那個對象構造在需要的返回的地址上,所以只能先構造在f的堆棧上,然后在調用一步移動構造函數(shù)
臨時對象的情景:

a先被構造存在數(shù)據(jù),通過賦值符號的重載先釋放,導致f的調用得首先提供一個存放f返回值的臨時對象的一個地址,在f返回之后該地址就是返回的對象,再通過默認的移動構造將臨時對象的值賦給a。

geta函數(shù)內構造了新的對象存放在8470,由main函數(shù)提供,剛好在a旁邊。
結束后調用移動賦值,將零食對象賦給a的地址。

構造兩個返回對象,根據(jù)輸入來決定返回對象
由main生成臨時地址,以后上同

過程,將返回的對象通過移動構造函數(shù)構造到臨時對象的地址上,之后調用移動賦值函數(shù),將返回值賦給a
生命周期延長,如果f需要返回對象,那么f的調用者需要提供一小塊內存保存返回的對象,期生命周期只有一個語句

出了該語句就會被析構掉。
利用A&&保存臨時對象,與A a=f()沒有很大不同?
生命周期延長延長的是返回對象的生命時間,若臨時對象內部包含別的引用,其實并沒有延長那個引用所引用的對象的生命時間???
為什么返回對象?
不只是數(shù)據(jù),包括其操作。

包含p以及釋放該p的析構函數(shù),實質上返回了一個可以自動釋放的內存,可保證無論和操作于內存,可按時釋放,若想保存可自行移動拷貝,放置生命周期更長的對象上。
棧的結構決定了數(shù)據(jù)的移動