在我的申请中,有大量小malloc
/ free
事件,婴儿死亡率很高。通常我会编写自己的内存池,但在看到使用tcmalloc
的性能后,我很想使用替换的malloc。是否有任何与原始内存池实现具有相似性能的实现?
对于C ++,我有另一个执行C ++ new
/ delete
舞蹈的应用程序。假设婴儿死亡率相同。两部分问题:
1)我如何实现一个对new
和delete
操作起作用的内存池?
2)是否有一种透明的方式,类似于glibc malloc动态库的特性,为所有类替换new
/ delete
内存分配器?
答案 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);
};
你可能想要添加更像我们习惯的new
和delete
的帮助成员函数。
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