假设我正在用 C 编写程序,如下所示:
Code: [1 global var, main(with local vars), 3 functions(with local vars)]
鉴于将在堆栈帧上进行函数调用,编译器如何一眼就知道要分配多少内存?
编译器出错导致程序出现内存不足错误的情况是否发生过?还是编译器总是会分配精确的或额外的内存?
它是否就此与操作系统进行调解?还是它自己做决定?操作系统是否会干预?
编辑: 我找到了一个很有帮助的答案:https://stackoverflow.com/a/19102036/5324086
最佳答案
- 全局变量以
.data
或.bss
结尾。 - main 和函数最终在程序内存中,通常称为
.text
。 - 计算堆栈使用量绝不是编译器的责任。它所做的只是创建将变量压入/弹出到堆栈的函数,但它不会为您计算一些最坏的情况。然而,编译器可能会通过使用 CPU 寄存器或函数内联来优化代码,努力最大限度地减少堆栈使用。
Given that function calls will be made on a stack frame, how does the compiler know at one glance how much memory to allocate?
它不知道。堆栈分配在运行时完成,程序员有责任确保程序不会耗尽堆栈内存。
Does it ever happen that the compiler went wrong and the program got out-of-memory error? Or will the compiler always allocate exact or extra memory?
在您的示例中,编译器分配的所有内存都是全局变量的内存,它最终位于 data/bss 段中,而不是堆栈中。编译器/链接器知道它可以为数据/bss 使用多少 RAM,并希望在内存用完时告诉您。
关于c - 编译器如何为程序分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32559240/