日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hash_map allocator

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。