许多小型分配的最有效的malloc实现?

时间:2011-09-06 03:24:55

标签: c++ c malloc

在我的申请中,有大量小malloc / free事件,婴儿死亡率很高。通常我会编写自己的内存池,但在看到使用tcmalloc的性能后,我很想使用替换的malloc。是否有任何与原始内存池实现具有相似性能的实现?

对于C ++,我有另一个执行C ++ new / delete舞蹈的应用程序。假设婴儿死亡率相同。两部分问题:

1)我如何实现一个对newdelete操作起作用的内存池?

2)是否有一种透明的方式,类似于glibc malloc动态库的特性,为所有类替换new / delete内存分配器?

4 个答案:

答案 0 :(得分:1)

您是否考虑过使用增强池?我使用它作为我的基础小对象分配器,并没有抱怨。它既有线程安全版本,也有非安全版本,易于使用。还有一堆其他特定的小对象分配器,你也可以考虑。

答案 1 :(得分:0)

还有jemalloc。不确定它与tcmalloc完全比较,但它并不像tcmalloc那样保留所有分配。

答案 2 :(得分:0)

至于“如何编写分配器”,§ 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);

答案 3 :(得分:0)

Alexei Alexandrescu std::allocator包装中的小对象分配器: CodeProject article link