C++ 中间值存储在哪里?

C++ where intermediate value store?

可以针对任何编程语言指出我的问题,但我想了解有关 C++ 的问题。我想知道中间值将存储在 C++ 中的什么位置?例如在下面的代码中:

int func1(int);
int func2(int);
int func3(int);
int main(){
    int a = 10;
    int b = func1(func2(func3(a)));
    cout<<b<<endl;
}

func3的return值会存放在哪里? func2呢?它会存储在 CPU 缓存中吗?还是拉姆? 另外,关于下面的代码, a*b 的结果将存储在哪里?或任何中间值:

int main(){
    int a = 10;
    int b = 15;
    int c = a*b+10*15;
    cout<<c<<endl;
}

如果依赖于编译器,请解释任何编译器,尤其是 GCC。

因为你只声明了函数,我假设它们在不同的编译单元中。所以编译器必须为它们生成一个函数调用。不可能对函数进行内联或专门化(查找 link 时间优化以了解这并不总是正确的)。

函数的调用方式、参数的传递方式和返回方式在 calling convention 中针对您的目标架构和 ABI 进行了定义。所以这不是特定于编译器的,因为来自不同编译器的目标文件如果遵循相同的 ABI,则应该是兼容的。

因此,这决定了每个单独进行的函数调用中发生的事情。在函数调用之间,值可以存储在堆栈或寄存器中,但通常编译器会尝试做最少的工作以将事物从一个函数 returns 的位置获取到下一个函数期望它们的位置。

PS:如果编译器看到了函数的定义那么所有的赌注都是。只要程序本身观察不到变化,它就可以为所欲为。

这个中间值传统上存储在堆栈上,但要注意堆栈可能 overflow.com :)