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 :)
可以针对任何编程语言指出我的问题,但我想了解有关 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 :)