看板 C_and_CPP 關於我們 聯絡資訊
當傳值進去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
LPH66: 我認為都對, 兩種狀況都會出現 12/02 03:20
LPH66: 不過對呼叫方跟被呼叫方來說兩者沒有差別就是了 12/02 03:21
LPH66: 所以編譯器會選適合的時候使用適合的策略 12/02 03:21
LPH66: 事實上對 C++ 的物件傳值的話, 語意上傳進是 2, 傳出是 1 12/02 03:22
LPH66: 而實際上傳出時會不會真用 1 這樣傳則不一定 12/02 03:23
LPH66: 這有個關鍵字叫「Return Value Optimization」 12/02 03:24
littleshan: 只要達到call by value的效果 (函式內改變不影響原值) 12/02 10:58
littleshan: compiler可以採用任何方法去做 12/02 10:58
littleshan: 目前常見的做法是LPH66所說的那樣 12/02 10:59
littleshan: 但也可能直接用register傳參數以提高傳遞效率 12/02 11:00
littleshan: 除非你自己要做compiler或是寫很底層的東西 12/02 11:01
littleshan: 不然其實不需要去管compiler怎麼幫你做 12/02 11:02
azureblaze: "Copy elision" 12/02 11:33
anoymouse: 好吧 我先查查你們說的關鍵字 謝謝! 12/02 12:49
Killercat: 其實寫個小程式 g++ -S就知道了... 不過上面大家說得對 12/02 15:57
Killercat: 這東西並沒有定義要怎麼實作 12/02 15:58
Killercat: #1JeAUWnb 裡面有提到一部分你講的東西 12/02 15:58