分配器
malloc,free,new,delete
申请内存操作要落在malloc()这个函数上,然后malloc()再去调用相应操作系统的API。
释放内存操作要落在free()这个函数上,然后free()再去调用相应操作系统的API。
malloc()申请的内存块类似上面这个样子(以VC6为例),可以看出有很多额外开销,尤其是内存块上面和下面的cookies,如果申请很多相同大小的内存块,就会有很多的cookies是多余的,造成了空间上的浪费。
::operator new()底层就是简单调用了malloc();::operator delete()底层调用了free()。
GCC2.9
GCC2.9的容器默认调用的分配器是alloc,这个alloc避免了cookies冗余所造成的空间浪费。大致是定义一堆链表,不同的链表存不同大小的内存块,节点#n调用malloc()函数,指向数据长度为n*8字节的空间,而后再对空间进行划分并使用单向链表组织空间。alloc即为pool_alloc,除pool_alloc之外还有很多其他类型的分配器。
GCC4.9
容器默认使用的变成了allocator,它的allocate()和deallocate()都是简单地调用了::operator new()和::operator delete(),并没有进行任何特殊处理(给人感觉功能退化了…)
未完成
array_allocator
mt_allocator
debug_allocator
pool_allocator
bitmap_allocator
malloc_allocator
new_allocator