我了解到,在Linux上“标准”的初始堆栈大小为大约8MB,在Windows上则为大约1MB。 但是,堆分配是如何工作的呢?操作系统是否像为堆栈分配内存那样为进程堆设置“虚拟”大小,包括已提交和保留的内存?
经典的程序布局通常在内存低端有“文本”(或“代码”)段,接着是固定数据(“数据”和“bss”段),随后是一个间隙,在此之后堆栈从高地址向下生长。中间的间隙成为堆,从数据段末尾向堆栈增长。对于线程化程序、加载共享库、共享内存等情况会变得更加复杂。初始堆栈大小取决于操作系统。逻辑上讲,初始堆大小为零,但往往会在程序和共享库加载时立即增长。
没有一般的“标准尺寸”。个别操作系统将有一个默认尺寸,但通常它们可以在程序图像或命令行中使用适当的参数进行修改。C语言可以在从只有几百字节可用内存的微型处理器到具有数百GB的巨大处理器阵列的各种系统中执行。在较大的系统中(包括大多数Windows和Linux环境),堆栈和堆将被分配到可以扩展的段中,因此不需要预留最大尺寸的物理内存。然而,许多微处理器缺乏内存映射硬件,必须预先保留大小(虽然有时堆栈和堆被使其相互增长,以便只有一个共同的限制)。