2011-09-06 22 views
5

在我的應用程序中,有很多小嬰兒死亡率較高的小型事件malloc/free。通常我會寫我自己的內存池,但在看到使用tcmalloc的性能之後,我很想使用替換的malloc。是否有任何類似於原始內存池實現的實現?許多小型分配的最有效的malloc實現?

對於C++,我有另一個應用程序,它執行C++ new/delete跳舞。假設嬰兒死亡率相同。兩部分問題:

1)我將如何實現一個作用於newdelete操作的內存池?

2)有沒有一種透明的方式,類似於glibc malloc動態庫的功能,用於取代所有類的內存分配器new/delete

+2

我想一個更好的問題是,爲什麼你堅持做「噸小的malloc /免費事件的高嬰兒死亡率」。這幾乎肯定反映了一個糟糕的設計。請注意,沒有可移植的方法來替換'malloc',但是您可以使用另一個分配器(例如內存池),它與「malloc」一起運行。 –

+3

作爲一個例子來澄清......如果你使用的'malloc(N)'其中'N <64'左右作爲一種方法將結果傳遞給調用者,你幾乎肯定會更好一個通過值結構或讓調用者傳遞一個指向目的地的指針(實際上兩者在現實世界的實現中是等價的)。對於這種小物體使用'malloc'唯一有意義的是當物體在記憶中靜止是必不可少的,例如,充當鏈接列表,樹等的一部分... –

+1

@R。在我目前的生活中,我試圖建立一個離散事件模擬器。在以前的生活中,我在爲股票市場建立訂單時遇到了這個問題。有許多情況下必須跟蹤大量實體並隨機進入/退出系統。 –

回答

1

您是否考慮使用增強池?我將它用於我的基本小對象分配器,並且沒有投訴。它既有線程安全也有非安全的版本,以方便使用。還有一些其他特定的小對象分配器,你可以考慮。

+0

「boost」是否適用於C++? –

+0

'boost :: pools'絕對是C++特有的。它是如何執行的?你有沒有嘗試做定時測試(rdtsc或基於牆)? –

+0

沒什麼特別的,但看看它。它基本上是一個基於數組的固定大小內存地址。 Alloc是一個pop(讀取數組,更新指針loc,返回),free是一個push。沒有什麼可以通過查看它的來源來說明你無法在C中做到這一點。如果您需要線程安全,那麼也有成本,但概念是相同的。那就是我要去的地方。 –

0

還有jemalloc。不知道它是如何與tcmalloc完全比較的,但它並不像tcmalloc那樣支持所有的分配。

+1

在我的測試中,jemalloc比glibc中的ptmalloc2更小的分配速度。 – osgx

0

至於「如何寫一個allocator」,§ 20.6.9 [default.allocator]具有這樣說std::allocator

#include <new> 

// specialize for void: 
template <> class allocator<void> { 
public: 
typedef void* pointer; 
typedef const void* const_pointer; 
// reference-to-void members are impossible. 
typedef void value_type; 
template <class U> struct rebind { typedef allocator<U> other; }; 
}; 

template <class T> class allocator { 
public: 
typedef size_t size_type; 
typedef ptrdiff_t difference_type; 
typedef T* pointer; 
typedef const T* const_pointer; 
typedef T& reference; 
typedef const T& const_reference; 
typedef T value_type; 
template <class U> struct rebind { typedef allocator<U> other; }; 
allocator() throw(); 
allocator(const allocator&) throw(); 
template <class U> allocator(const allocator<U>&) throw(); 
~allocator(); 
pointer address(reference x) const throw(); 
const_pointer address(const_reference x) const throw(); 
pointer allocate(size_type, allocator<void>::const_pointer hint = 0); 
void deallocate(pointer p, size_type n) throw(); 
size_type max_size() const throw(); 
template<class U, class... Args> 
void construct(U* p, Args&&... args); 
template <class U> 
void destroy(U* p); 
}; 

你可能會想補充一點表現得更像newdelete我們幫助成員函數習慣於。

template<class... Args> 
pointer alloc_and_constr(size_type n, Args&&... args); 
template <class U> 
pointer destr_and_dealloc(U* p); 
+0

這並不意味着是一個完整的答案,而只是他有一個我懷疑許多人會處理的子問題的有用信息。 –