我正在阅读有关可供使用的内存段的C文本。文本说两个最高的段是堆和堆栈,它们相互增长。
Segments:
________
|Text (Machine code)
|________
|Data
|________
|BSS
|________
|Heap (grows towards stack)
|
|
|Stack (grows towards heap)
|________
创建一个简单的程序来打印在较低的四个段中创建的变量的内存位置,产生以下结果:
initialized in | Hex Address | Decimal Value
Data - 0x080497ec 134,518,764
BSS - 0x080497f8 134,518,776
Heap - 0x0804a008 134,520,840
Stack - 0xbffff844 3,221,223,524
堆和堆栈的解释是否有〜3亿个字节来共享它们?我正在处理的计算机只有1 GB的内存,这让我怀疑这种解释的准确性。
答案 0 :(得分:3)
那里有3GB的地址空间,并不意味着它必须被映射(很可能不是)。这只是空间,当程序要求时,操作系统仍然需要将物理内存映射到该空间。
你读到的这种内存模型已经过时了。现代操作系统具有更复杂的内存布局,堆不必线性增长,堆栈有时位于其他所有内容之下,文本和数据不一定必须彼此相邻。添加共享库,地址空间布局随机化,事情变得非常时髦。