7: 分配器

operator new () 和 malloc()

所有分配内存的底层 基本都会分配到malloc() malloc再去根据系统去调用具体的系统调用函数

下面的图可以看到 operator new 里面也是封装的malloc()的函数调用
在这里插入图片描述
malloc 实际分配的内存 是比你想要的内存是要大的 其他的每一位的作用 可以在内存调用相关课程里面学习
附加的东西 格外开销基本都固定的 图中蓝色的部分才是用户真正需要的 其他部分是额外开销

stl 中allocator的使用

在这里插入图片描述
如图可以看到 vector list deque里面的分配器都是一样的 allocator<_Ty>

allocators 内部实现

vc的分配器 并没有太多的技巧可言

在这里插入图片描述
里面分配allocate 底层是调用operator new 而这个底层是调用malloc函数
里面释放deallocate 底层调用delete delete底层调用的是free

下面是BC5的stl 设计

在这里插入图片描述

在这里插入图片描述

GCC的allocators

注意下面是老版本的allocator 不是现在在使用的

在这里插入图片描述

2.9版本GCC使用的allocator是什么?

在这里插入图片描述
gcc allocator现状的运行模式 某个阶段 只有图 源代码可以在内存管理的课程里面学习(待学1)
在这里插入图片描述

设计就是尽量减少malloc次数的开销 减少malloc所带来的额外开销
如图所示 图中有16个链表 从1到16排序 每个链表负责管理的都是n*8字节的大小
所有的容器 需要内存的时候 都来问这个分配器要内存 容器的倍数大小会被调整成8的倍数
比如我需要50个字节 那么就会被分配到56个字节 会到对应的链表里面去查询是否有可用空间 没有的话就会去申请 申请一大块内存并做切割 切割成这个链表管理的大小 8 的倍数 并用单向链表去连接
这样申请出来的内存cookie较少 比每次逐次分配的开销更小
gcc的优化地方就在于这个地方

这里面cookie的作用

我们malloc出来的空间一般直接通过 free去释放 不需要记录传入的指针所指向的地址占用空间 因为这部分已经在malloc的时候 被记录在额外开销里面去了 gcc这样设计allocator是不需要这种cookie的 每个空间都有自己的管理链表来控制

4.9版本的GCC allocator

在这里插入图片描述

4.9版本的allocator情况没有 2.9的版本好 这一点有疑惑

但是4.9版本仍然保留着2.9的allocator设计 并改名如下
在这里插入图片描述

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值