C++ 编译器如何在堆栈上分配内存

C++ 编译器如何在堆栈上分配内存,c++,c,C++,C,如果我在函数中有几个局部变量,比如- void fun() { int a,b,c,d,e,f,g; } 编译器是否为每个变量逐个分配内存?如果有的话 为什么编译器不一次读取所有变量,然后为其分配内存 一枪打死他们 编译器不会为它们中的任何一个分配内存。源代码和最终可执行文件之间的差异比这更复杂。不过,简而言之,如果这些变量最终实际存在于执行计算机上(这一点并不确定:可以优化批次!),它们的大小将与堆栈帧的大小一致,而堆栈帧的大小很大程度上是“构造的”只要根据每次进入/离开此范围时堆栈指

如果我在函数中有几个局部变量,比如-

void fun()
{
  int a,b,c,d,e,f,g;
} 
编译器是否为每个变量逐个分配内存?如果有的话
为什么编译器不一次读取所有变量,然后为其分配内存
一枪打死他们

编译器不会为它们中的任何一个分配内存。源代码和最终可执行文件之间的差异比这更复杂。不过,简而言之,如果这些变量最终实际存在于执行计算机上(这一点并不确定:可以优化批次!),它们的大小将与堆栈帧的大小一致,而堆栈帧的大小很大程度上是“构造的”只要根据每次进入/离开此范围时堆栈指针递增的距离即可


从这个意义上讲,编译器将“一次性为它们分配内存”。但基本上不会

取决于编译器、优化选项等。在大多数情况下,此代码会导致单堆栈帧指针值更新。“为什么编译器不一次读取所有变量,然后一次性为它们分配内存?”。这大概就是大多数编译器所做的。是什么让你认为内存不是一次性分配的呢?投票赞成这个答案值得一次投票赞成,因为它发现了一个隐藏的秘密,没有说出来。注意,由于这些是纯整数,编译器更可能决定这些变量应该在CPU寄存器中分配。同样的原理,编译器不会“分配”它们,而是创建一条机器代码指令“将a存储在寄存器r中”,作为程序的一部分。@Lundin非常低级的相关推理,我喜欢这样。我认为它们会自动存储在程序的内存中,所以是的。你有电子邮件吗?