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

看板C_and_CPP (C/C++)作者 (沒有暱稱)時間11年前 (2014/12/02 02:20), 11年前編輯推噓3(3014)
留言17則, 5人參與, 最新討論串1/1
當傳值進去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 可能是堆疊什麼的原理 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.136.114.140 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1417458051.A.0A5.html ※ 編輯: anoymouse (220.136.114.140), 12/02/2014 02:22:04

12/02 03:20, , 1F
我認為都對, 兩種狀況都會出現
12/02 03:20, 1F

12/02 03:21, , 2F
不過對呼叫方跟被呼叫方來說兩者沒有差別就是了
12/02 03:21, 2F

12/02 03:21, , 3F
所以編譯器會選適合的時候使用適合的策略
12/02 03:21, 3F

12/02 03:22, , 4F
事實上對 C++ 的物件傳值的話, 語意上傳進是 2, 傳出是 1
12/02 03:22, 4F

12/02 03:23, , 5F
而實際上傳出時會不會真用 1 這樣傳則不一定
12/02 03:23, 5F

12/02 03:24, , 6F
這有個關鍵字叫「Return Value Optimization」
12/02 03:24, 6F

12/02 10:58, , 7F
只要達到call by value的效果 (函式內改變不影響原值)
12/02 10:58, 7F

12/02 10:58, , 8F
compiler可以採用任何方法去做
12/02 10:58, 8F

12/02 10:59, , 9F
目前常見的做法是LPH66所說的那樣
12/02 10:59, 9F

12/02 11:00, , 10F
但也可能直接用register傳參數以提高傳遞效率
12/02 11:00, 10F

12/02 11:01, , 11F
除非你自己要做compiler或是寫很底層的東西
12/02 11:01, 11F

12/02 11:02, , 12F
不然其實不需要去管compiler怎麼幫你做
12/02 11:02, 12F

12/02 11:33, , 13F
"Copy elision"
12/02 11:33, 13F

12/02 12:49, , 14F
好吧 我先查查你們說的關鍵字 謝謝!
12/02 12:49, 14F

12/02 15:57, , 15F
其實寫個小程式 g++ -S就知道了... 不過上面大家說得對
12/02 15:57, 15F

12/02 15:58, , 16F
這東西並沒有定義要怎麼實作
12/02 15:58, 16F

12/02 15:58, , 17F
#1JeAUWnb 裡面有提到一部分你講的東西
12/02 15:58, 17F
文章代碼(AID): #1KVB632b (C_and_CPP)
文章代碼(AID): #1KVB632b (C_and_CPP)