怎么做门户网站设计方案,网站框架文案,网站文件上传wordpress修改,网站程序风格GNU C对allocators的描述 new_allocator 和malloc_allocator#xff0c;它们都没有特别的动作#xff0c;无非底部调用operator new和malloc。它们没有用内存池 区别#xff1a;::operator new是可重载的 智能型的allocator#xff0c;使用内存池#xff0c;分一大块然后…GNU C对allocators的描述 new_allocator 和malloc_allocator它们都没有特别的动作无非底部调用operator new和malloc。它们没有用内存池 区别::operator new是可重载的 智能型的allocator使用内存池分一大块然后切分成小块。 这类allocator有bitmap_allocator, pool_allocator, _mt_allocmultithread多线程的分配器 第三讲说明了实际malloc也是使用的内存池因此速度提升不明显很大的优势是减少了cookie GNU C 提供三种测试用于测速插入数据测试多线程状态下的插入和删除测试多线程的生产者和消费者模型测试。测速分配器的效率 debug_allocator 不做分配的事情只是在申请的内存外包一层
VS2013标准分配器G4.9标准分配器与new_allocator以及G4.9malloc G4.9array_allocator 指针_M_array指向一个C数组分配释放都是对数组的操作静态数组不需要释放归还。所以deallocate没做任何事 array_allocator使用例子
G4.9 debug_allocator debug_allocator是一个包装器把另一个分配器包装进来这里是_Alloc分配器定义为_M_allocator,实际分配的时候就是调用这个分配器的allocate分配n extra个大小的空间 第三讲介绍的分配器 在GNU C4.9版本的__pool_alloc就是上面2.9版本的alloc。它的缺点是什么呢只拿不还不把分配的空间还给操作系统 __pool_alloc测试用例
bitmap_allocator 最重要的是_M_allocate_single_object和_M_deallocate_single_object 容器每次请求的都是一个元素的内存分配所以这里就是单独处理一个object的请求。当不是一个object的时候就会退化到operator new和operator delete 客户是容器的使用容器要的一个元素的内存空间就是block如果是std::list的时候这个block还包括node里面的指针 上图中一次性挖64个blocks挖取数量是两倍成长 加上前面的bitmap还有前面的数值一起称为super block。 需要64位的bimap对应blocks数量来表示每个block的状态。bitmap是unsigned int一个bitmap是32位只能记录32个blocks的情况。这里是64个blocks需要2个bitmap来记录 前面还有一个unsigned intuse count记录有几个block被分配 最前面还有一个unsigned int记录super block的大小记录的大小不包括这个unsigned int本身的大小是其之后的大小 有一个mini vector模拟标准库中的vector写出来的来操纵super block里面的start指针和finish指针分别指向super block的头和尾 分配内存下面深灰色这个block被分配出去use count 1然后bitmap[0]最后一位变成0表示已经分配出去 分配第二个block下面两个灰色的block表示被分配出去use count 2bitmap[0]后两位变成0表示这两个block被分配出去 一直分配block出去已经分配出去63个block对应的use count 63bitmap[1]和bitmap[0]变成80000000H和00000000H只有最后一个block对应的bitmap中的bit才为1,表示未被分配出去 归还其中一个block对应的bitmap要变成1表示未分配回收回来然后use count由63变成62 当1个super block(有64个blocks)用完后开始启用第二号super block这时候super block中的block块数由64扩大两倍变成128个由4个bitmap整数表示。 而且mini vector中由一个单元变成两个单元每个单元指向一个super block 第二个super block用完前面已经用完第一个super block其含有64个blocks第二个super block包含128个blocks也已经用完启用第三个super bloc其包含的blocks为128 x 2 256个。 mini vector中也有第三个单元来控制这个super block 第一个super block全回收用另一个mini vector称为free list中的entry指针指向这个super block表示已经回收
如果下次新分配一个super block它其中blocks的数量要减半。前三个superblocks大小分别为64个128个256个由于第一个superblock被回收那么下次分配的superblock大小由已经分配的最大值256变成一半为128个blocks
原来的mini vector里面的指向回收的这个superblock头和尾的entry被删除 第二个super block也全回收则free list里的entry加一个指向这个super block。 原来的mini vector里面指向这个superblock头尾的entry被删除 第三个super block被全回收被free list的指针指向