视频地址:
http://player.bilibili.com/player.html?aid=31289365&bvid=BV1iW411d7hd&cid=114735283&page=9
课件地址:
对应于书中的3.10小节。
如有错误请指出,谢谢。
真实物理内存通过操作系统将其映射虚拟内存,从程序员的角度,内存就被抽象为一个很大的字节数组,每个元素是一个字节。在86-64机器上,64位二进制数为该数组地址进行编码,意味着64位操作系统最大能容纳 字节的内存大小,目前市面上该大小的内存还不是很普及。现在64位机器会限制只使用47位的地址,这也能支持 字节,即128T的内存大小。只使用47位编码时,最小地址为0x0
,而最大的地址为0x00007FFFFFFFFFFF
。
虚拟内存存储数据也是分不同区域的,如下图所示(不是按比例绘制的),地址从下到上依次递增。
limit
查看,如果用栈指针访问超过8MB范围的地址,就会出现段错误(Segmentation Fault)。 相同程序的栈的分配是固定的。printf
和malloc
的这类库函数平时是被存储在磁盘上的,当我们程序需要使用库函数时,就会在程序开始执行时,将它们加载到你的程序中,这称为动态加载(Dynamic Linking)。malloc
、callc
或new
**等申请的变量,这些变量在程序运行时会动态变化。当你不断通过malloc
申请空间又没释放时,堆顶的指针就不会断向高地址增加,使得占用的内存不断变多。堆在分配时是具有随机性的。以以下代码为例