现在标准库中容器分配的默认类都是
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>...
中的allocator
类, 这样的类里面分配的内存空间每一个元素都要额外分配内存记录分配内存的大小以及元素所占的字节, 但是容器中的元素大小都是一样的, 因此这样子分配浪费许多空间.
之前在G2.9版本中的分配器采用了不同的分配方式:
其中的主要思想是:
用#0
到#15
的16个bit分别负责对应的字节大小, 比如#0
中所指向的已分配的内存每一个都是8个字节, #7
则是负责64个字节的大小, 以此类推. (十分具体的还得看侯捷老师的内存管理).
现在的标准库不使用这种方法, 但是还是有保留的, 在ext/pool_allocator.h
中.
然后在__gnu_cxx
命名空间中.
#include <vector>
#include <iostream>
#include <ext/pool_allocator.h>
using namespace std;
int main()
{
vector<int, __gnu_cxx::__pool_alloc<int>> v = {1,2,3,4};
for(auto e : v){
cout << e << endl;
}
return 0;
}
输出:
1
2
3
4