STL----空间配置器
1, STL为什么给出将空间配置器单独给出?
答:
标准的空间配置器:是将 operator new 以及 operator delete 进行封装,没有什么实际的所用,没有解决下面的问题。
2,什么是空间配置器?
一级空间配置器:(用户申请的空间大于128字节)
使用 malloc + free + 空间不足的应对措施(oom_Malloc)
Allocate(size) ----> malloc ----> OOM_Malloc ---->空间不足的应对措施(函数):
用户提供 应对函数 :去执行对应的措施函数
用户没有提供应对函数: 抛bad_alloc异常
二级空间配置器:(用户申请空间小于等于128字节)
使用:内存池技术
使用过程:
1,用户的申请空间字节数小于内存池的空间时,直接从内存池中获取。
,2,为了将用户申请的并归还的空间有效的管理起来,使用链表进行管理。
为什么将用户申请的字节数对齐到8的整数倍?
A,使用来链表来管理就必须有存放指针的空间。在64位操作系统中,一个指针的大小是8个字节。所以要对齐到8的整数倍。
B,当用户每次申请的字节数都是8的整数倍时,产生的空间块就只有16种。这样就可以将每种空间大小一样内存块用链表连接起来,并将者16种链表通过哈希表连接起来 。
用户如何使用空间配置器
1,申请空间
void * Allocate ( size_t size )
szie > 128 字节:一级空间配置器。
size <= 128字节 :二级空间配置器
1,通过用户size计算index
2,检测当前链表中是否有节点
是:将 链表中第一个节点分配给用户(头删方式----效率高)
否:Refill ():将 size 向上对齐到8的整数倍,向内存池里要
void * ReFill(size_t size (已经是8的倍数))
1,chunk_alloc 向内存池索要nobjs(20)个size字节的小 内存块
2,nobjs == 1 :chunk_alloc只提供了一块-------直接分配给用户,不必挂到链表上
3, 1 < nobjs <=20 : 将第一块空间交给用户使用,剩余的nobjs-1块空间挂到对应的链表中
4,nobjs==0
void * chunk_alloc(size_t& objs , size_t size)
1,计算内存池剩余的空间,leftBytes
2,计算总共需要的空间 , totalBytes
分配空间:
a,leftBytes >= totalBytes: 直接提供objs块(20)
b,leftBytes >=size : 起码能提供一个size的空间
c,leftBytes <size : 连一块都提供不了:
想办法去找空间:
1,向系统要
成功:调用chunk_alloc,(此时内存池里有空间了)
失败 ;想办法
2,到自由链表中找,是否有交大的空间
有:内存池----->chunk_alloc
无:想办法
3,一级空间配置器:有空间不足的应对措施,有可能会申请成功,没有的话就抛异常。
有:内存池----->chunk_alloc
无:抛异常
用户归还空间 :
void* DeAllocate ( void * p , size_t size )
1,size >128 :调用一级空间配置器
2,size <= 128 :挂接到对应的自由链表中 (头插)
。3,STL空间配置器解决什么问题?
A,频繁向系统申请小的内存块,易造成内存碎片的问题。
B,导致运行效率低。
C,额外空间浪费。每次申请会多申请36个字节。
D,内存泄漏。
4,STL空间配置器有什么缺陷?