2011-03-02 87 views
2

我認爲這個問題是語言無關,並道歉,如果這是相當簡陋,但說我們(在這個例子PHP)函數的返回值在哪裏存儲?

function myFunc() { return 4; }

現在,當這個函數被調用,通常的結果將在用於一個表達式或被分配給一個變量。但是如果它沒有賦值給一個變量,那麼當它被調用時,返回值「存活」在哪裏?是否有一個內部結構將其保存在內存中以用於當前語句的目的,並且當該語句執行時,它會再次刪除它?

+2

這不是真正的語言無關,因爲它依賴於特定的語言有很多(甚至可能同一種語言的不同實現之間變化)。 – 2011-03-02 09:57:48

+0

通常返回值傳遞給調用堆棧。但這絕不是語言(實現,真的)不可知的。 – 2011-03-02 10:09:31

回答

1

注:C++特定)在大多數情況下的編譯器將在獲得分配給函數的結果的變量用戶Return Value Optimisation和存儲的值。

例如:

int myInt = myFunc(); 

將使指針myInt varaible到由傳遞給myFunc在棧上,從而myFunc將與myInt直接而無需創建新的變量。

否則通過將返回值的堆棧上的函數返回。

我認爲在.NET中,它被稱爲Name Return Value Optimization

其他編譯器可能就有類似的功能。

2

如果你只是這樣做:

var foo = bar(); 
myFunc(); 
var wibble = baz(); 

然後一個數字4將爲return語句來創建,然後立即將在目前還沒有給它的任何引用丟棄。

+0

右鍵,所以說我們有一個更復雜的語句,如myFunc()+ ComplexFunction(); - 我們說ComplexFunction()需要很長時間才能評估,那麼myFunc()的返回值會保存在內存中的某個位置,直到整個語句被評估爲止,如果有的話,是否有一個名字? – persepolis 2011-03-02 10:00:59

0

所以說,我們有一個像myFunc的()+ ComplexFunction()一個更復雜的語句

我覺得這一個依賴於編譯器和它的register allocation scheme

編譯器可以將myFunc()的結果存儲在寄存器中,然後跳轉到執行ComplexFunction()。在輸入ComplexFunction()時,寄存器將被保存在堆棧上並在返回時被恢復。