[問題] function的傳值&回傳值副本問題

作者: anoymouse (沒有暱稱)   2014-12-02 02:20:49
當傳值進去function的時候 此值會產生一個暫時的副本 函式的回傳值也會產生一個
暫時的副本 。
比如說 int x=5;
int ref=function(x);
int function (int y)
{
int s;
s=y+1;
return s;
}
請問這副本是說記憶體有一個未命名空間(姑且稱呼為#)
1.傳進函式的時候 x把值給# #在給y 回傳的時候 s把值給# #在給ref
還是
2.傳進函式的時候 x把值給y 回傳的時候 s把值給ref 不需要什麼中間人#
我一直在想 x把值複製給y 也就是現在主副程式存在兩個一樣的值但位址不一樣
那這樣是否可稱呼 y就是這所謂的副本?
直到y做完函式要它作的計算 s=y+1 s把值傳回給ref s就是所謂的副本?
所以是1對 2對 還是都不對? 我覺得是1 可能是堆疊什麼的原理
作者: LPH66 (-6.2598534e+18f)   2014-12-02 03:20:00
我認為都對, 兩種狀況都會出現不過對呼叫方跟被呼叫方來說兩者沒有差別就是了所以編譯器會選適合的時候使用適合的策略事實上對 C++ 的物件傳值的話, 語意上傳進是 2, 傳出是 1而實際上傳出時會不會真用 1 這樣傳則不一定這有個關鍵字叫「Return Value Optimization」
作者: littleshan (我要加入劍道社!)   2014-12-02 10:58:00
只要達到call by value的效果 (函式內改變不影響原值)compiler可以採用任何方法去做目前常見的做法是LPH66所說的那樣但也可能直接用register傳參數以提高傳遞效率除非你自己要做compiler或是寫很底層的東西不然其實不需要去管compiler怎麼幫你做
作者: azureblaze (AzureBlaze)   2014-12-02 11:33:00
"Copy elision"
作者: anoymouse (沒有暱稱)   2014-12-02 12:49:00
好吧 我先查查你們說的關鍵字 謝謝!
作者: Killercat (殺人貓™)   2014-12-02 15:57:00
其實寫個小程式 g++ -S就知道了... 不過上面大家說得對這東西並沒有定義要怎麼實作#1JeAUWnb 裡面有提到一部分你講的東西

Links booklink

Contact Us: admin [ a t ] ucptt.com