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: 所有類對象都共享同一個內存池
總結
以上是生活随笔為你收集整理的hash_map allocator的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看进程占用内存
- 下一篇: little problem