为什么要实现内存池?
一方面 是为了减少 调用 malloc()
的次数(尽管 malloc()
不慢) 但是调多了 会产生(外碎片)
另一方面 是因为 每次用 malloc()
分配到的内存 是要交税的 就是上一节中讲的 cookie
里面记录着 这一块内存的大小信息(内碎片) 特别是在频繁申请小内存的时候尤为明显
最终 pool_allocator 版本
具体代码可见 Memory_Pool
1 | // |
内存管理迭代之一
最简陋的版本 简单的来说就是 一次获取 一大块内存 然后串成链表 每次要就返回其中一块
多用了一个指针 成员变量也就4个字节 一个指针多占用了 8 个字节
1 | class Screen { |
内存管理迭代之二
上一个版本 最大的缺陷就是说 多占用了个指针 这对于只有 一个 int 的类来说 有点浪费
使用 union
将类 的 成员变量和链表指针包起来 节约内存
1 | class Airplane { |
内存管理迭代之三
静态版本
前面两个 必须要为不同的 classes
重写一个几乎相同的 member operator new 和 member operator delete
因此这个版本 将其抽取出来 放到一个 class
中
1 | class allocator { |