[ C++ ] 勿在浮沙筑高台 —— 内存管理(9~16p)primitives(下)
阅读原文时间:2023年07月09日阅读:3
  • per-class allocator 2

    tips: operator new重载 不会被派生类实际使用,因为父类大小内存的分配交给子类去调用明显是不正确的。实际上会被转交至 : : operator new.

    operator delete:

    使用例:

    对pre-class allocator 2的个人理解:通过Union联合体实现内存空间 “待使用”(入池?)和“正在使用” (出池?) 两种状态的区分:

    AirplaneRep 变量 是 ”正在使用“ 状态下的对象内容,Airplane * 指针作用是在 “待使用” 状态下以链表的形式维护 “内存池”(菜鸡如我并不知道这里能否被这么称呼)。

    (注意malloc下分配的内存并不一定连续,故这里出现了下标和指针并用的古怪状况,同时视频中的图例也有些许迷惑性,不是很好理解)

    成员operator new的作用如下所述:

    当FreeList头部不为空,则有剩余,将FreeList头部指针右移一步长,并返回原头部位置作为new分配结果。若已为空,则内存不够,将在已分配的内存块后再分配BLOCK_SIZE * sizeof(Airplane)大小的内存,并从1号块开始用next串起来。表尾next为NULL,FreeList头部指针指向1号块地址,并返回0号块作为本次分配结果。

    成员operator delete的作用如下所述:

    将要释放的对象放回FreeList头部,并将FreeList头部指针指向该对象。(链表前插法!)

    原谅太弱了。。原来还有这么骚的操作,惊了

  • static allocator

    静态形式,代码可复用。思路同上。不过这里没有使用union,而是通过struct将未分配块前四字节当作指针将块串起来。

    调用:

    原型:

  • 现代的allocator —— global allocator

    不在每个类内单独实例化一个allocator了,而是选择全局的实现,下面这个雏形可以应付16种不同的内存块大小。