c - 堆栈和堆内存的大小
如前所述,大小是特定于操作系统的。例如,在使用 Visual Studio 的 Windows 上,默认堆栈大小为 1MB
微软
在 Linux 上,以下命令可以显示您当前的命令。
ulimit -s or -a
在我的 Linux mint 64 位上,它显示 8192 KB。
加载到内存中的每个程序都有几个段。在汇编中,可以使用 .data、.code 等前缀 (intelx86) 来指示其中的每一个。
它是具有几个子部分的数据段。除了其他几个之外,堆栈和堆都是它的一部分。
堆栈也可以隐式增长,即当您进行另一个函数调用时,激活记录被推入堆栈,它们通过利用更多的堆栈内存。这就是为什么当程序用完分配的堆栈时无限递归会导致崩溃。
当函数调用返回时,该激活记录被弹出并且堆栈收缩。
相反,堆从相反的方向增长并包含所有动态分配的内存。
这两个段以相反方向增长的原因是为了最大限度地利用它们的组合内存。请注意,正如评论中提到的,这不是交流标准,但大多数常见的操作系统都实现了这一点。
------ 堆栈开始 ----------- 堆栈向下增长
-------- 除非它们相互交叉,否则程序可以运行。
--------堆开始------------堆向上增长
如果您的程序不使用堆,则您的堆栈也可以利用最大内存,包括堆内存。如果程序很少进行递归调用并使用最少的局部变量(即堆栈使用较少的内存),它可以最大限度地利用堆。
数据段的其他部分是 BSS 等,可能包含未初始化的静态变量等字段