2011-03-02 26 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()时,寄存器将被保存在堆栈上并在返回时被恢复。