堆栈是在运行时还是编译时分配的?
例子:
void main()
{
int x;
scanf("%d", &x);
int arr[x];
}
堆栈在运行时分配;但是,每个堆栈帧的布局是在编译时决定的,可变大小数组除外。
它必须在运行时分配。考虑以下:
void a( void )
{
int x;
}
void b( void )
{
int y;
a();
}
int main( void )
{
a();
b();
}
a() 中堆栈本地 x 的地址在其两次调用之间将不同。正如blinkenlights 所指出的,每个函数的堆栈帧的布局在很大程度上是在编译时确定的,但该帧的位置是在运行时确定的。
你将如何分配编译时间?如果我在我的机器上编译代码但在你的机器上执行它,编译器如何能够为你机器上的堆栈预分配内存?
这应该会有所帮助。堆栈内存是在运行时分配的。
请记住,它必须在运行时分配,因为编译器无法知道函数被调用了多少次,或者 while 循环执行了多少次,等等。
为了补充所有其他答案(在一般情况下是正确的),理论上有时可以在编译时分配堆栈(取决于您对“分配”的定义)。
具体来说,如果您的程序没有函数指针或递归,那么可以使用静态分析来确定所需的最大堆栈大小。事实上,一些嵌入式编译器正是这样做的。
堆栈总是在运行时分配,您需要堆栈来执行方法而不是编译。
看看这篇很棒的文章
http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory
这是一篇很棒的文章,解释了程序存储器。您还可以查看同一作者关于 s 系统中的内存行为的其他文章,这将使您深入了解内存中的实际工作。
如果您想了解有关内存的所有信息,请尝试阅读 Ulrich Draper 的这篇论文 http://www.akkadia.org/drepper/cpumemory.pdf
希望这可以帮助!
当然堆栈是在运行时分配的。您需要堆栈内存来执行 code.ec
检查讨论 C 程序的内存布局的此链接。