2017-10-20 161 views
0

我有一個池分配器,我寫作爲練習,它實現了C++ 11 std :: allocator需求啓動並運行,但工作正常,但我使用的策略爲基準(根據以下紙):將固定大小的池池分配器調整到特定的STL容器

https://pdfs.semanticscholar.org/4321/a91d635d023ab25a743c698be219edcdb1a3.pdf

是隻用於一次分配一個單獨的對象成具有足夠的大小,它存儲一個塊非常好。

我注意到std :: allocator模板方法「allocate」有一個參數,其中STL容器可以請求同時分配塊的數量。例如,它看起來像std :: basic_string,一旦超過它在堆棧中保留的特定大小的字符串,通過向分配器請求連續的內存塊以將存儲char數組的內存塊連續移動到堆中拿着整個字符串。 std :: vector的動態擴展似乎以類似的方式工作。

是否有任何方法來調整分配器設計爲返回固定大小的塊大小類型的模板,這種類型的STL容器?

+2

標準分配器需要能夠爲指定數目的模板類型的項目分配連續存儲。 –

+1

您可以提供(可選)成員'size_type max_size()',並在違反時拋出 – Caleth

回答

1

你可以沿着這條路走下去:

On the other hand, multiple instances of numerous fixed-sized 
pools can be used to produce a general overall flexible 
general solution to work in place of the current system 
memory manager. 

而且對待每一個不同大小的請求,作爲一個新池的請求,也就是你的「對象大小」實際上是反對*計數。 您將燒燬大量的RAM。 您可以在數組大小上設置一個上限,並返回到上面的默認通用分配。

+0

我注意到我的實現似乎足夠通用,我可以將分配器放入分配器中,即創建一個包含N個內存池的內存池它們自己分配足夠大的連續存儲塊以容納std :: basic_string的字符數組。不幸的是,std :: basic_string期望它的分配器被模板化爲一個字符類型,而不是指向一個char數組的指針,所以我必須想出一種方法來修改實現,以便它的塊大小足夠大以返回連續存儲當以基本類型爲模板時 – Bitrex

+1

向分配函數添加第二個參數,即單元數。 –