什么是堆栈的“标准”大小和C程序中的堆?

我已经读过Linux上的“标准”和初始堆栈大小约为8MB,Windows大约为1MB。

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

经典地,程序的布局在内存的低端具有“文本”(或“代码”)段,然后是固定数据(“数据”和“bss”段),后跟一个间隙,与堆栈从高记忆中向下生长。 中间的间隙变成了堆,它从数据的末尾向堆栈增长。

线程程序,加载的共享库,共享内存等等都比较复杂。

初始堆栈大小取决于o / s。 初始堆大小在逻辑上为零,但几乎立即增长(因为程序和共享库已加载)。

没有一般的“标准尺寸”。 各个操作系统将具有默认大小,但通常可以使用程序映像或命令行中的相应参数进行更改。

C在各种系统中执行,从微型微处理器只有几百字节的可用内存到具有数百GB的巨大处理器arrays。

在较大的系统(包括大多数Windows和Linux环境)中,堆栈和堆将分配给可以扩展的段,因此不需要预先保留最大大小的物理内存。 但是,许多微型计算机缺少内存映射硬件,并且必须预先保留大小(尽管有时堆栈和堆会相互增长,因此只有一个共同的限制)。