2013-07-21 40 views
3

我對使用多個標準地圖感興趣< int,int >我希望所有人都從一個公共內存池中分配元素。從我目前閱讀的內容來看,我可以使用自定義分配器(例如Boost pool_alloc)來實現此目的。如何完全管理像地圖一樣的std容器的堆內存分配?

我的問題是,儘管使用像Boost pool_alloc來管理元素本身的分配,std map仍然會使用堆內存的一小部分作爲某種形式的容器開銷,不會由boost pool_alloc管理?我正在考慮一些關於使用std映射本身的指向元素的指針?

+0

你問一個包含指針的容器嗎?對不起,但我不明白... – Stefan

+0

@Stefan:不,不是包含指針的容器。鑑於自定義分配器將負責分配元素本身,我問是否所有容器內存開銷的std :: map也將由自定義分配器覆蓋。我希望這有助於澄清我的問題 – polemic

+0

好的。瞭解。沒有。具體的分配器負責爲堆中的特定元素分配空間,而不是爲容器本身分配空間。如果你想改變,你需要重載運算符新/刪除您的特定容器。 – Stefan

回答

2

短版

地圖類型,如:

typedef std::map< 
    int, 
    int, 
    less<int>, 
    boost::pool_allocator<pair<const int, int> > 
    > 
    AMapType; 

將盡一切需要,因爲它生長使用boost :: pool_allocators分配。一些初始結構可能會在堆棧上創建。多少,什麼確切的結構將取決於實施。

分配器重新綁定

上面能夠通過使用allocator::rebind

所有的std ::分配器符合的分配器(諸如升壓:: pool_allocator)提供形式的重新綁定模板結構:

template<class U> struct rebind{ 
    typedef AllocatorType<U> other; 
}; 

這可以被用於獲得相同種類的分配器用於不同類型:

typedef AllocatorOfOther AllocatorType::rebind<ADifferentType>::other; 

GCC的std ::映射內部結構

的克++的std ::映射實現(I檢查4.7.3和4.1.1)純粹是內置了單個節點的類型。這包括關鍵值對以及rbTree結構所需的指針和顏色位。爲了分配它,它使用來自用戶提供的分配器的rebind結構定義一個節點分配器。這用於地圖增長時的所有分配。每個新節點都被分配到一個分配中。

標準

我檢查雖然C++ 11標準,找不到任何指定這樣的結構應該如何分配。要麼我找不到合適的部分,要麼沒有指定。不使用給定分配器類型的用戶似乎沒有意義。

+0

只是想澄清:根據我的理解,重新綁定元素T將元素T轉換爲某種類型的節點,並附加了左指針和右指針(或其他類似的指針)。這是否意味着,除了Node元素(由rebind生成)本身之外,將不會有由std :: map創建的其他分配? – polemic

+0

@polemic希望我最近的編輯已澄清? – PeterSW