0

我正在阅读关于可用内存段的 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

堆和堆栈之间有大约 30 亿字节要共享的解释吗?我正在使用的计算机只有 1 GB 的内存,这让我怀疑这种解释的准确性。

4

1 回答 1

3

那里有 3GB 的地址空间,这并不意味着它必须被映射(很可能不是)。它只是空间,当程序要求时,操作系统仍然必须将物理内存映射到该空间。

您读到的这种内存模型已经过时了。现代操作系统具有更复杂的内存布局,堆不必线性增长,堆栈有时位于其他所有内容的下方,文本和数据不一定必须彼此相邻。添加共享库,地址空间布局随机化,事情变得非常时髦。

于 2013-03-28T12:23:50.550 回答