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空间配置器有什么缺陷?

猜你喜欢

转载自blog.csdn.net/wm12345645/article/details/81777684
今日推荐