【发布时间】:2017-05-09 17:26:28
【问题描述】:
考虑到我们可能不希望总是在多次调用中存储函数的返回值的情况,请使用以下代码:
int foo()
{
return 1;
}
从以下过程中调用。
void main()
{
foo();
}
foo 的返回值会发生什么变化?在没有找到变量地址时,编译器是否将其放在备用寄存器中 - 还是在执行下一条语句时将其擦除? 如果现在改为将返回值存储在某处:
void main()
{
int retval;
retval = foo();
}
这两种方案的性能差异是什么?是否将 retval 存储在某处会导致堆栈管理出现任何问题?
编辑:自己的配置:工具集:V100,__cdecl (/Gd):在 VS10 中运行 Win32 编译为 C++ - 内联会起作用吗?
我们只能猜测有多少特定配置适用于给定的一组答案。一本小书可能就够了!
至于性能,int 是一个糟糕的选择,也许 float 或 double 会产生更大的影响?
这个问题与建议的副本不同,如下所示:
假设 foo 的返回地址被添加到调用帧中,一种情况是 retval 的地址放在它的下方,但是如果 retval 为 NULL 是否有额外的开销?
【问题讨论】:
-
您的问题的答案取决于架构。许多架构总是将返回值存储在寄存器中。在您的示例中,
retval可能仅存储在寄存器中,而根本不存储在堆栈中。 -
您的代码中没有地址。 C 和 C++ 是不同的语言。选择你实际使用的那个!
-
虽然正确的答案取决于编译器和体系结构,但您可以期望适合寄存器的返回值将通过寄存器传递。您可以稍后在调用者代码中将其存储在堆栈中。 -O3 在这两种情况下都会优化掉你所有的代码。
-
@Ap31:C 标准中既没有要求使用寄存器,也没有要求使用堆栈。实际上存在无寄存器架构和不使用堆栈的实现。并且针对特定实现的特定优化选项是完全不相关的。
-
@Olaf 你说的当然是对的,我试图做到现实