這個(gè)函數的返回值在那里的問(wèn)題。
給一個(gè)簡(jiǎn)單的函數
int fn(int a);
ing fn(a){
int ntmp;
ntmp=a+1;
return ntmp;
}
應該是在CPU的那個(gè)寄存器中呢?還是內存的那個(gè)位置?
如果我用一下 fn(100);
那我怎么知道去哪里找返回值呢??
int fn(int a);
======================
函數return時(shí),把返回值放在寄存器EAX中。
如果程序中需要用到int fn(int a);的返回值,如:int i = fn(100);
那么在函數返回后,將累加器EAX中的值,存入變量i。
你去看看你的編譯器編譯出來(lái)匯編代碼,就知道,返回值在EAX里面了。
還有,如果是16位的機器中,應該是在A(yíng)X中
X86的機器 小于等于1個(gè)字時(shí)放在 EAX 中,大于一個(gè)機器字小于等于2個(gè)字的放在 EDX:EAX中,大于2個(gè)字的在棧上開(kāi)辟一段臨時(shí)的空間存放返回值,浮點(diǎn)數類(lèi)型的返回值放在ST0中。
ARM的是返回值放在RO中,其他的機器還沒(méi)怎么用過(guò)。
int result = fn(100);
這樣就保存到result變量中去了。
這要看具體編譯器的設計。對于簡(jiǎn)單的而且小的返回值,一般放在寄存器,對于復雜的對象
作為返回值的時(shí)候,一般通過(guò)函數調用棧找到返回值的地址,然后寫(xiě)該地址.
記得thinking in c++ volume 1中說(shuō)得很清楚的
這個(gè)看你編譯器的實(shí)現了啊
vc是放在EAX寄存器中
這個(gè)你看一下匯編代碼就知道了啊,
至于函數的返回值在那里,這要由編譯器根據返回值的類(lèi)型和具體的調用情況等等因素來(lái)決定。幸好對函數的使用者來(lái)說(shuō),他不需要知道具體的存放位置就可以使用返回值。
再回到題目上來(lái)。對于樓主提供的這個(gè)fn()函數來(lái)說(shuō),它的返回是一個(gè)int型數。這種情況下一般的處理就是放到寄存器中;但并不總是這樣,因為還可能跟調用情況有關(guān)。例如下面的例子:
const int& ri = fn(100);
ri是函數返回對象(int型)的常量引用。由于被引用,函數返回對象的生存期得到了延長(cháng)。顯然這種情況下這個(gè)函數的返回值就不能始終放在寄存器中了;這時(shí),編譯器一般會(huì )采取另一種策略:在內存中創(chuàng )建一個(gè)無(wú)名的臨時(shí)對象來(lái)保存函數的返回值。
以上想法沒(méi)有經(jīng)過(guò)確認。是不是這樣,請大家驗證。
按約定,都是放在eax中,如果不按約定放在任何能放數據的地方都可以
const int& ri = fn(100);
===================================
這種是需要使用返回值的情況,函數返回后,從寄存器中取出數據,放到內存中(產(chǎn)生臨時(shí)變量),由
ri引用。
返回值在寄存器只是臨時(shí)的存放,即從被調函數的return開(kāi)始,到返回調用處。
函數返回后,返回值必須馬上轉移到內存(或者丟棄),因為寄存器要用來(lái)執行指令。
在VC中,應該是放在EAX寄存器中
另外補充一個(gè),C++允許給const引用綁定臨時(shí)對象。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。