内存模型抽象
1 内存的 3 segment 模型
2 Heap Segment
“堆内存管理器”负责“堆”的管理!
这里有个概念叫做“空闲表”!堆内存管理器是以“链表”的数据结构为基础管理堆中的一个个数据块的!
2.1 堆是个大数组!
- 整个“堆”的概念
- 堆中单个数据块的结构:
思考:如果对“静态”数组使用free()会造成什么后果?
答:假如 free() 成功了!会把“栈”中的空间加入到堆管理器的“空闲表”里面!
2.2 “堆内存压缩”概念
一般现在的计算机不支持“堆内存压缩”,因为现在的内存都很大了(普遍达到 8/16/32GB),不需要去堆区里面抠唆那么一点点空间!
Macintosh(1994~1995) 支持堆内存压缩,可以将已经使用的数据块放在一起,没使用的数据块放在一起,从而可以拼出更大的空闲数据块!
但是也有问题哦:堆内存管理器在移动数据块的时候,这些数据不能被访问!即:堆内存的压缩与2级指针的 dereference 不能同时执行!
使用“可压缩的Heap” 的步骤:
void **handle = NewHandle(40); // 二级指针开辟(可压缩的)动态内存
...
...