hash_map && allocator

1 hash_map定义在__gnu_cxx下

template<class _Key, class _Tp, class _HashFcn = hash<_Key>,
             class _EqualKey = equal_to<_Key>, class _Alloc = allocator<_Tp> >
          class hash_map;

其中, 简单的 hash<Key>  定义在_gnu_cxx下, 通常自定义Key, 需要实现hash<Key>

equal_to定义在std下, 自定义的Key也需要实现equal_to

 

 

 

2 allocator

默认的是ext/new_allocator。

使用其他allocator时, 如mt_allocator:

using namespace __gnu_cxx;

 

typedef int hash_map_key;
a)  typedef __mt_alloc<hash_map_key, __common_pool_policy<__pool, true> > myhash_alloc;

b)  typedef hash_map<hash_map_key, V, hash<hash_map_key>, std::equal_to<hash_map_key>, myhash_alloc> myhash_map;

 

a 中, __common_pool_policy 的第一个参数是一个模板类, 该模板接收一个bool参数;   第二个参数是个bool;

疑问? hash_map的allocator的value类型为什么不是pair<hash_map_key, V>, 而是 hash_map_key????  那么插入大量对象时, V也需要使用自己的缓存?

 

 

 

 

 

 

 

 

自定义类直接使用allocator

【重载new, 或者把构造函数和析构函数作为外部不可访问成员。 封装allocator的allocate&deallocate】

typedef __mt_alloc<V, __common_pool_policy<__pool, true> > myalloc;
myalloc m;
//--------new operation. get memory && construct

V *p1 = m.allocate(sizeof(V), 0); //这里没有调用V的构造函数。。
std::cout <<"not constructed: " << p1->i <<"," << p1->j <<"/n";
//placement new

//--------delete operation. destruct && free mem----------//

//do some job
//p1->~V()
m.deallocate(p1, sizeof(V));

 

allocator可以处理成与对象相关【vector的内存池方式,相同类型的不同vector对象,其内存池未必是同一个。 】

与类相关【相同类型的对象公用内存池: 把freelist等处理成静态的】;

或者全局的allocator: 所有类对象都共享同一个内存池

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值