2016-02-13 36 views
2

我想爲std::map指定allocator。所以編寫自定義的,從Josuttis獲取here的基本代碼。我想用boost::object_pool來獲得高性能。但boost::object_pool不提供API分配n其通過接口功能要使用boost :: object_pool來實現map的自定義分配器,如何使用boost :: object_pool分配n個連續元素?

pointer allocate (size_type num, const void* = 0)

allocator

需要連續的元件。

如何在boost::objet_pool中分配n個連續元素?任何其他開源對象池都提供相同的功能。

我看到boost::simple_segregated_storage具有界面

void * malloc_n(size_type n, size_type partition_sz);

void free_n(void * chunks, size_type n,size_type partition_sz); 

需要分配單元的大小,我不認爲可以很容易地使用對象池。

回答

0

下面的回答是純粹的黑客使用boost::object_pool來執行allocatorstd::map。需要在平臺上測試解決方案(特定版本的操作系統,編譯器,boost和C++ std lib組合)。

似乎std::map,從不要求超過一個元素的連續內存,這樣你就可以實現alloctor的API pointer allocate (size_type num, const void* = 0)只分配一個元素,即,對key-value,爲num總是要爲1

我檢查了插入多個元素的情況,複製地圖的構造函數,在地圖中插入多個元素,使用另一個地圖的begin iteratorend iterator單個調用map::insert傳遞元素的範圍。

在RHEL7上測試了它,boost 1.57.0,gcc版本4.8.2 20140120(Red Hat 4.8.2-16)

+0

呵呵。什麼方案? 「map」與你的問題有什麼關係?而且,是的,當然map **不會一次分配多個節點(它是基於節點的,迭代器/引用失效規則意味着它不應該),除非你願意冒着不好的分段情況的風險,又名資源泄漏) – sehe

+0

@sehe:問題是,我想用boost :: object_pool爲std :: map構建allocater。但boost對象池需要支持連續的'n' no元素塊來支持標準的分配器接口。但是它可能會被黑客攻擊,因爲std :: map只能分配1個元素,因爲這是std :: map到分配器的唯一需求 –

相關問題