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