2013-04-24 40 views
0

我正在研究使用類超載新聞和刪除與放置新聞之間的優缺點。我的意思是,要麼聲明我可能希望新建的每個類,並用自己的運算符重載刪除它們,要麼通過使用內存管理器通過放置新的方法爲我提供所需的內存。類重載新的和刪除vs定位新的定製內存類

我有一個存儲器管理器,允許我從多個池分配內存:

enum MemPool 
{ 
    kPool1, 
    kPool2, 
} 

class MemoryManager 
{ 
public: 
    template <typename T> 
    void* Allocate(MemPool pool); 
    void Remove(MemPool pool, void* ptr); 

}; 

MemoryManager g_mmgr; 

的分配是模板因爲在調試模式下我存儲每個分配(經由typeid的(T)的名稱。名稱()),我可以通過的sizeof得到每個分配的大小(T)

我把自己看作具有至少2個選擇如何分配,我試圖決定哪個是最好的語法使用方面,效率,安全性和便攜性。

選項1是一個帶有新聞和刪除的模板化基類,它包裝了mempool並且很適合我。

template <typename T, MemPool pool> 
class MemPoolUser 
{ 
public: 
    static void* operator new(int size) 
    { 
    return g_mmgr.Allocate<T>(pool); 
    } 

    static void operator delete(void* ptr) 
    { 
    g_mmgr.Remove(pool,ptr); 
    } 
}; 

然後我可以保證每一個可通過的MemoryManager需要newing類這樣宣稱:

class MyClass : public MemPoolUser<MyClass, kPool1> 
{ 

}; 

這將讓我簡單地做

MyClass* c = new MyClass(); 
... 
delete c; 

和正確的新並在MemPoolUser內部刪除將被調用。

方案2是使用放置消息:

class MyClass 
{ 

}; 

MyClass* c = new (g_mmgr.Allocate<MyClass>(kPool1)) MyClass(); 
.... 
c->~MyClass(); 
g_mmgr.Remove(kPool1,c); 

任何利弊每個選項?選項1似乎很整潔,但我必須知道每個類需要分配的mempool類型,這可能取決於其他運行時因素。

選項2是更靈活,但newing和刪除在語法上是醜陋的(它可以被包裹在#define語句)

所以我的問題是,除了上面所說的問題,有什麼事我都未能考慮這兩種選擇,並且比另一種更危險?

+0

我實際上想嘗試的是有一個模板化的全局新建和刪除,它將mempool作爲一個類型與新對象的類型一起使用,但即使我可以定義這些函數,也不可能稱它們爲而不明確地呼叫運營商新的,這將不會呼叫ctor或dtor進行刪除。 – makar 2013-04-24 13:57:53

回答

0

如果你必須做到這一點(我希望你有一些相當不錯的用例,其中有一些特定的需要這些對象的特定內存池),我一定會去operator newoperator delete解決方案。它允許使用此代碼的應用程序代碼以最少量的額外編碼寫入超出典型代碼的代碼。