2010-09-08 56 views
3

是否有可能在C++中創建一個自定義分配器的作品簡直是這樣的:創建一個範圍自定義內存池/分配器?

{ 
    // Limit memory to 1024 KB 
    ScopedMemoryPool memoryPool(1024 * 1024); 

    // From here on all heap allocations ('new', 'malloc', ...) take memory from the pool. 
    // If the pool is depleted these calls result in an exception being thrown. 

    // Examples: 
    std::vector<int> integers(10); 
    int a * = new int [10]; 
} 

我找不到像這樣的Boost庫,或其他任何地方。

有沒有一個根本性的問題,使這不可能?

+1

看一看的Boost.Pool庫。 'boost :: pool_allocator'和'boost :: fast_pool_allocator'可以用作'std :: vector'和其他容器的分配器。 – 2010-09-08 18:48:59

回答

0

是否有一個根本性的問題,使這不可能?

關於程序行爲的爭論將變得根本不可能。各種奇怪的問題都會出現。代碼的某些部分可能會執行,也可能不會執行,儘管這對最終可能不受阻礙的部分沒有影響。某些部分可能總是失敗。處理標準庫或任何其他第三方庫將變得非常困難。有時可能會在運行時分裂,有時甚至不會。

+3

呃..怎麼這樣?無法處理內存分配失敗的庫是一個糟糕的庫。 – 2010-09-08 18:41:15

+0

重載全局'new'和'delete'是一個壞主意。一般來說。原因如我所述。該OP說,如果內存不可用,將拋出異常。請注意,這並不意味着一個範圍的池中的內存耗盡必然會影響爲下一個範圍定義的池。 – dirkgently 2010-09-08 18:49:07

2

是的,你可以製作這樣的結構,它在很多遊戲中都有使用,但基本上需要實現自己的容器並調用你創建的池的內存分配方法。

你也可以嘗試爲STL容器編寫一個自定義的分配器,雖然看起來這種工作通常被禁止。 (之前我已經完成了,它很單調乏味,但我不記得任何具體問題。)

記住你自己的內存分配器不適合心靈的懦弱。你可以看看Doug Lea's malloc,它提供了「內存空間」,你可以在你的範圍構造中以某種方式使用它。

+2

恕我直言,OP希望在每個範圍基礎上微調分配器(可能是爲了讓他可以不必編寫不同的分配器並創建STL容器專門化)。因人而異。 – dirkgently 2010-09-08 18:38:00

+0

通常我會建議不要嘗試使用STL容器和本地內存分配例程。編寫你自己的內存分配系統有很好的理由,但是它們的成本也相當高。 (是的,我看到他們使用的方式是自定義分配器的行爲,而不管命中的是什麼,但是沒有標準容器存在,也沒有使用'new','delete'或'malloc'系列函數。 ) – 2010-09-08 18:41:13

+0

@dirkgently:你說得對。 – StackedCrooked 2010-09-08 18:41:23

1

我會回答一個不同的問題。看看'高效的C++'書。他們討論的一件事是實施這種事情。這是一個Web服務器

對於這個特定的事情,你可以混淆在C++層通過重寫新的和提供自定義分配器到STL。

或者你可以在混亂的malloc的水平,從那裏開始使用自定義的malloc和工作(如dmalloc)

+0

你的意思是? - > http://www.amazon.com/Efficient-C-Performance-Programming-Techniques/dp/0201379503 – 2010-09-08 18:39:23

+0

yes(C++)by Bulka and Mayhew – pm100 2010-09-08 20:12:34

3

您將需要創建您在通過爲模板參數去向量自定義分配器。這個自定義分配器本質上會將訪問權限包裝到您的池中,並進行所需的任何大小驗證。

0

如果意圖是該範圍內的所有分配都與該分配器對象一起發生,那麼它本質上是一個線程局部變量。

因此,如果您使用static或全局變量來實現它,將會出現多線程問題。否則,對於分配器的無狀態來說不是一個糟糕的解決方法。

(當然,你需要通過一個第二個模板參數如vector< int, UseScopedPool >。)