文章目录
- operator new () 和 malloc()
- stl 中allocator的使用
- allocators 内部实现
- vc的分配器 并没有太多的技巧可言
- 下面是BC5的stl 设计
- GCC的allocators
- 2.9版本GCC使用的allocator是什么?
- 这里面cookie的作用
- 4.9版本的GCC allocator
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设计 并改名如下