《STL源码剖析》之分配器

版权声明:转载请注明出处 https://blog.csdn.net/HeXiQuan123/article/details/87930392

对于分配器的要求,应满足C++标准中的几个函数:

1.分配器应是一个模板类,设类型为T

2.模板类对象应有public:T* allocate(int n)功能,分配一段长为至少为n*TypeSize的内存(原始,未构造)保存n个类型为T的对象,返回指向分配内存头部的T类型指针

3.应该有deallocate(p,n),其中p为上述T类型指针,n不能是任意的数字,应与分配时的n大小相同;

4.应有构造函数,construct(p,arg),目的是调用类型T的构造函数

5.应有destroy(p),只析构p指向的对象。

大前提是已知:内存从哪里来?答:malloc来的

一个很重要的思想就是,如何合理的使用malloc和free,也就是说,分配的思想到最后,就是传一个byte_size到malloc里,但是除此之外:

1.我们需要调用构造函数来构造,而且构造函数应有重载写法,即迭代器区间写法

2.我们需要调用析构函数,而且析构函数应有重载写法,即迭代器区间写法

3.out of memory,内存池没内存,malloc不到内存,应有处理方案:内存池可以看做一个哈希表,一个索引下可能有m个大小相同并指针(其实这里是个联合类型)相连的蛋糕,不同索引间的蛋糕大小不同,所以当申请某个索引失败时,就malloc,malloc失败的话就只能回收内存池其他索引下的蛋糕了。

我们将存储看为三部分,1.已经使用的;2.大块儿(分配时malloc直接调用存储器的内存);3.小块儿(分配时用指针操作,将内存池的内存分配过去);源码剖析中SGI以128byte为区分;根据需求,2和3中进行选择。

猜你喜欢

转载自blog.csdn.net/HeXiQuan123/article/details/87930392
今日推荐