c - 编译器如何为程序分配内存?

标签 c memory-management compiler-construction

假设我正在用 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/

相关文章:

转换 X509_STORE_load_locations() 调用以从内存加载数据

c - 这是终止 C 或 Perl 中的 for 循环的合适方法吗?

c - 如何将 C 代码编译为原始的无操作系统二进制文件?

c - htonl() 与 __builtin_bswap32()

c - 这个函数有什么问题吗?

c - c 中的内存损坏

c++ - 链接 : fatal error LNK1248: image size exceeds maximum allowable size (80000000)

c++ - 结构的内存分配问题

C# 空语句

c++ - 尝试 'Make' CUDA SDK,ld 找不到库,ldconfig 说可以