C++ 内存管理(二)std::allocator

本文详细探讨了C++中的std::allocator,包括VC6和G2.9的实现。重点分析了G2.9的alloc源码,描述了内存分配、战备池管理以及碎片处理策略。通过对allocate、deallocate、refill和chunk alloc函数的剖析,揭示了std::alloc如何高效管理内存。
摘要由CSDN通过智能技术生成

目录

 

一、VC6 标准分配器的实现

二、G2.9 分配器的实现

三、G2.9 std::alloc 源码剖析

3.1 alloc 类基本设计

3.2 refill 函数

3.3 chunk alloc 函数

四、std::alloc 运行细节观察


一、VC6 标准分配器的实现

VC 中的 allocator 只是实现了到 _Allocator -> operator new -> malloc 的调用,实际并未实现优化的内存管理。也就是说通过 VC 编译器 allocator 所获得的内存都带有 cookie。内存分配时,需要的元素个数与元素类型作为参数传入 allocate,在其后面的计算中才实现了计算需要多少以字节为单位的实际内存的操作。

二、G2.9 分配器的实现

G2.9 所使用的 allocator 并不是传统的形式,而是具有独有特性的 alloc。调用时参数就是所需要的内存大小,以字节为单位。

G4.9 中的 __pool_alloc 与 alloc的本质是相同的,实现了消除 cookie 的目的。

GCC 2.9 编译器中 — 使用独有的分配器 alloc:

  • 通过一个链表组 free list,下标表示其下挂的不同大小的内存元素(8,16,24......),只有每个链表组下申请的一大块内存会有 cookies 冗余,其内部的内存被分为相等的小块存储内容,以指针连接起来,小块就不再有冗余的问题。
  • alloc 维护了16条链表组成的链表组,当所需要的管理内存超过16组时,使用传统的 malloc 管理。
  • 每次申请内存时࿰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值