存储函数的返回值在哪里?

时间:2011-03-02 09:50:54

标签: function language-agnostic

我认为这个问题与语言无关,如果它非常简陋,我会道歉,但我们说(在本例中为PHP)

function myFunc() { return 4; }

现在调用此函数时,通常会将结果用于表达式或分配给变量。但是,如果它没有分配给变量,那么返回值在被调用时会“活动”在哪里?是否有内部结构将其保留在内存中以用于当前语句的目的,并且当执行该语句时,它会再次将其删除?

3 个答案:

答案 0 :(得分:2)

如果您只是执行以下操作:

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

然后将为return语句创建一个Number 4,然后立即将其丢弃,因为没有任何对它的引用。

答案 1 :(得分:1)

注意:C ++特定的)在大多数情况下,编译器将使用 Return Value Optimisation 并将值存储在获取分配给函数结果的变量中。

例如:

int myInt = myFunc();

会将myInt变量指针传递给堆栈上的myFunc,因此myFunc将直接与myInt一起使用,而不会创建新变量。

否则函数通过将返回值放在堆栈上来返回。

我认为在.NET中它被称为Name Return Value Optimization

其他编译器可能具有相似的功能。

答案 2 :(得分:0)

  

所以说我们有一个更复杂的语句,比如myFunc()+ ComplexFunction()

我认为这个取决于编译器而且它是register allocation scheme

编译器可以将myFunc()的结果存储在寄存器中,然后跳转到执行ComplexFunction()。在输入ComplexFunction()时,寄存器将保存在堆栈中,并在返回时恢复。