分配器为为容器再内存中分配空间。容器的一般默认分配器是 std::allocator ,该分配器是一个类模板。
对内存空间分配的动作(分配器,new,operator new()等)一般最后都会调用malloc() 。malloc() 再根据不同的操作系统调用其底层的API。同理释放内存对应的free()。
malloc(size)分配的内存:
除了要求的size意外malloc(size)还会在头尾添加一些额外开销(记录整块的大小用于free(),内存对齐等)。所以当size较大时有效内存所占比例大,malloc()的空间使用率更好。
分配器一般含有两个重要的函数allocate() 和deallocate()。用于分配和释放内存。
std::allocator的allocate() 调用operator new() ,而operator new() 又调用malloc() 。deallocate() 调用operator delete() ,operator delete()再调用free()。并没有做其余优化。它对容器中每一个元素都调用一次malloc()。
GNU 2.9中std容器使用的分配器为:alloc
每次malloc(size)一块较大的内存,再将其切割成许多大小不同的小块给容器中每个元素使用,减少malloc() 次数,从而降低额外开销(额外开销只在malloc()时产生)
但是GNU 4.9中std容器使用的分配器为std::allocator
其为容器内每一个元素分配内存最终都要调用malloc()。
(为什么不用alloc了?可能有缺陷?)
GNU4.9中之前的alloc还在,被改名为__pool_alloc。使用方法:vector<int, __gnu_cxx::__pool_alloc > v;