C语言程序中,堆栈的“标准”大小是多少?

6

我了解到,在Linux上“标准”的初始堆栈大小为大约8MB,在Windows上则为大约1MB。

但是,堆分配是如何工作的呢?操作系统是否像为堆栈分配内存那样为进程堆设置“虚拟”大小,包括已提交和保留的内存?


它不仅适用于C程序,而且完全依赖于操作系统。 - sidyll
好的,我只是试图更具体一些。因为JVM堆也存在。 - Julio Vga
2个回答

3
经典的程序布局通常在内存低端有“文本”(或“代码”)段,接着是固定数据(“数据”和“bss”段),随后是一个间隙,在此之后堆栈从高地址向下生长。中间的间隙成为堆,从数据段末尾向堆栈增长。对于线程化程序、加载共享库、共享内存等情况会变得更加复杂。
初始堆栈大小取决于操作系统。逻辑上讲,初始堆大小为零,但往往会在程序和共享库加载时立即增长。

1
堆大小的限制是什么?它会和栈一样吗?我找到了一个包含某些架构中栈最大大小的文件[链接](http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt)。 - Julio Vga
@user1030615 不,堆比栈大得多。通常情况下,当所有其他部分获得它们的内存时,堆是“剩下来的”。 - Seth Carnegie
1
这给我带来了另一个问题,即“剩下的部分”的大小是多少,我的意思是总内存布局的大小。 - Julio Vga
1
在32位机器上,总地址空间名义上为4GB。其中,您有代码、数据和堆栈段 - 剩下的任何东西都可以用于堆。此外,内存映射文件、共享内存段等会占用您的4GB虚拟地址空间。在64位机器上,您拥有多倍可用的虚拟内存,但大致适用相同的规则 - 主要区别在于您不会因逻辑地址空间而耗尽寻址容量,但可能会耗尽物理地址空间(甚至虚拟地址空间)。 - Jonathan Leffler

2
没有一般的“标准尺寸”。个别操作系统将有一个默认尺寸,但通常它们可以在程序图像或命令行中使用适当的参数进行修改。
C语言可以在从只有几百字节可用内存的微型处理器到具有数百GB的巨大处理器阵列的各种系统中执行。
在较大的系统中(包括大多数Windows和Linux环境),堆栈和堆将被分配到可以扩展的段中,因此不需要预留最大尺寸的物理内存。然而,许多微处理器缺乏内存映射硬件,必须预先保留大小(虽然有时堆栈和堆被使其相互增长,以便只有一个共同的限制)。

我认为栈的正常大小是1 MB(适用于“正常”的x86个人电脑),不是吗? - Seth Carnegie
我在这个文档中找到了8MB的标准大小。 - Julio Vga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接