2009-10-21 12 views
8

我想用不同的實例STL的自定義allocator類來管理不同的存儲空間,並可以指定一個分配器實例的STL容器,每個容器只能從平其分配的內存空間。但我不明白我該怎麼做。我看到如何將分配器類型傳遞到STL容器的模板參數中,但我希望類似於將分配器實例傳遞到STL容器的構造器中。有沒有辦法在STL中做到這一點?STL自定義的分配來管理不同的存儲空間

回答

17

不幸的是STL分配器不能有狀態(或至少必須非常小心,怎麼說狀態下使用) - 特定分配類型的每個實例必須是等值STL容器與他們有效地開展工作。我不記得細節的權利,但我知道,斯科特邁爾斯在長度"Effective STL"討論了這個問題,第10項:注意分配器約定和限制的。

但是,可以已經模板是與分配器之間的差異非常相似的被封裝在分配器類型,並使用不同的分配程序的模板的「實例化」分配器(每個模板「實例」是一個不同類型的) 。再一次,我的回憶是,梅耶斯清楚地討論了這一點。

例如看到的一篇文章本款Anthony Aue, "Improving Performance with Custom Pool Allocators for STL"

一種可能更嚴重需要注意的是,由於分配器使用非靜態數據,因爲該標準要求的不是技術上符合標準的,同樣的分配器類型相當。請參閱有效的STL(第10項)以全面解釋問題。這相當於要求給定類型的分配器能夠釋放由該類型的分配器的任何其他實例分配的內存。對於標準容器的許多用途,這個要求是不必要的(有些人可能會說Draconian)。但是,有兩種情況需要這種要求:list :: splice和swap()。 swap()的情況特別嚴重,因爲它需要以異常安全的方式對容器執行某些操作(請參閱Exceptional C++,第12項)。從技術上講,交換可以(在某些情況下,)在不比較分配器面對同樣實施,項目可以被複制或分配器可以與被交換的數據一起,但是這並非總是如此。出於這個原因,如果你使用swap()或list :: splice,你應該確保使用HoldingPolicySingleton;否則,你一定會遇到一些非常討厭的行爲。

另請參閱Stephan T. Lavavej在this newsgroup thread的討論。

如果其他人在此期間沒有提供詳細信息,我將在今晚稍後更新。

+2

但值得注意的是,C++ 0x將需要支持不相等的分配器。 – 2009-10-22 00:49:35

+1

你說得對,值得注意 - Stroustup關於C++ 0x「Scoped Allocators」的常見問題解答:http://www.research.att.com/~bs/C++x0xFAQ.html#scoped-allocator – 2009-10-22 17:40:51

+0

+1 - 希望我能更多地解決這個問題。 STL中的分配器一直是相當noob-敵對的 - 吸引比提供功能更深奧的錯誤。 – Fox 2009-11-19 19:31:14

0

也許你可以編寫一組分配器類型包含靜態指向單獨的存儲空間。

然後,當容器STL構造其分配器,分配器使用spaceassigned到分配器的存儲器。

爲簡單起見,假設你想使用這兩種存儲空間。創建兩個分配器類型,每個空間一個。根據需要將分配器類型傳遞給STL容器構造函數。

6

STL容器允許你在通過分配器作爲參數傳遞給構造函數。

例如這裏有適當的構造向量:

explicit vector(const Allocator& = Allocator()); 
explicit vector(size_type n, const T& value = T(), 
    const Allocator& = Allocator()); 
template <class InputIterator> 
vector(InputIterator first, InputIterator last, 
    const Allocator& = Allocator()); 

默認情況下,他們只是使用默認的構造分配器。