我在http://msdn.microsoft.com/en-us/library/ee292117.aspx和http://msdn.microsoft.com/en-us/library/ee292134.aspx上看到Microsoft为专门提供的宏和类分配器,但我不确定每个缓存策略是什么,如何使用它们.有人可以解释何时使用这些部件?
cache_freelist- cache_freelist模板类维护一个大小的内存块的空闲列表Sz.当空闲列表已满时,它用于operator delete释放内存块.当空闲列表为空时,它用于operator new分配新的内存块.空闲列表的最大大小由参数中max class传递的类确定Max.每个存储块保持Sz可用存储器的字节并且数据operator new和operator delete需要.cache_suballoc- cache_suballoc模板类将释放的内存块存储在具有无限长度的空闲列表中,使用freelist<sizeof(Type), max_unbounded>和子分配来自operator new空闲列表为空时分配的较大块的内存块.每个块都包含Sz * Nelts可用内存的字节operator new和operator delete需要的数据.从未释放分配的块.cache_chunklist- 此模板类用于operator new分配原始内存块,子分配块以在需要时为内存块分配存储空间; 它将释放的内存块存储在每个块的单独空闲列表中,并用于operator delete在没有任何内存块被使用时释放块.每个内存块保存Sz可用内存的字节和指向它所属的块的指针.每个块都包含Nelts内存块,三个指针,一个int operator new以及operator delete需要的数据.我自己写了几个分配器,但是这个文档只是......令人困惑.
哇,他们真的乱了文档,不是吗?(当我在Dinkumware时,我写了那段代码)
这里的分配器是基于策略的:您可以指定缓存策略和同步策略.
基本思想是使编写使用内部缓存的分配器更容易,并且可以跨线程同步.有六个预定义的分配器; 他们的名字都以allocator_.如果符合您的需要,请使用它们.在MSDN中,查看特定分配器描述的第一段; 不要阅读他们谈论的"备注" ALLOCATOR_DECL;
您还可以使用该代码创建自己的分配器,这些分配器使用预定义的缓存策略(名称以其开头的模板cache_)和同步策略(名称以其开头的模板sync_),或者使用您自己的缓存模板和同步模板.从这些部分获取可用的分配器有点单调乏味,因此标题提供ALLOCATOR_DECL了一种方便的方式来生成所有必需的样板,而无需自己编写.ALLOCATOR_DECL有三个参数:要使用的缓存模板的名称,要使用的同步模板的名称以及您正在创建的分配器的名称.所以不要写作
template <class T> class name
: public Dinkum::allocators::allocator_base<T, sync<cache > >
{
public:
name() {}
template <class U> name(const name<U>&) {}
template <class U> name& operator = (const name<U>&)
{return *this; }
template <class U> struct rebind
{ /* convert a name<T> to a name<U> */
typedef name<U> other;
};
};
Run Code Online (Sandbox Code Playgroud)
你会写的ALLOCATOR_DECL(cache, sync, name);.allocator_base重举; 分配器本身必须是派生类型,以便它可以rebind正确处理.(该Dinkum代码中的代码来自Dinkumware文档;我不知道Microsoft的东西将这些名称放在哪个命名空间中,但可能是宏在那里放了正确的名称).
对于缓存模板:
cache_freelist维护节点大小的块的链表; 列表的最大大小由模板参数设置Sz,节点分配由operator new和管理operator delete. cache_suballoc添加另一个管理Nelts节点块的层,全部分配为单个blob; 新元素的分配首先查看空闲列表,如果没有空闲,则分配新的blob.在销毁分配器之前,不会删除内存块. cache_chunklist在blob(如cache_suballoc)中分配内存,但不使用常见的空闲列表; 当一个块被释放时,它会回到它的blob的空闲列表中.释放所有blob块后,将删除blob本身.| 归档时间: |
|
| 查看次数: |
463 次 |
| 最近记录: |