码迷,mamicode.com
首页 > 编程语言 > 详细

[ C++ ] 勿在浮沙筑高台 —— 内存管理(9~16p)primitives(下)

时间:2020-05-21 11:59:18      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:静态   思路   对象   一个   operator   list   形式   区分   不同的   

  • 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种不同的内存块大小。
    技术图片

[ C++ ] 勿在浮沙筑高台 —— 内存管理(9~16p)primitives(下)

标签:静态   思路   对象   一个   operator   list   形式   区分   不同的   

原文地址:https://www.cnblogs.com/Cha2azzZ/p/12929525.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!