在分析我的应用程序后,我发现有太多malloc
s。我很惊讶shared_ptr
和shared_array
为引用计数分配了内存。除此之外,封装引用计数的对象包含两个计数uses_count
和weak_count
以及指向虚拟表的指针。对我来说,当我只需要一个简单的引用计数类时,这似乎有些过分。有没有办法调整shared_ptr
和shared_array
来实现更简单的方案?无需额外调用malloc
且只能使用一个计数器:uses_count
。或者在STL或Boost中有一个更简单的类?
答案 0 :(得分:4)
如果使用boost::make_shared
,该函数将在一次调用new
时为ref计数器和对象分配内存。
弱参考的附加计数器应该不是一个大问题,因为它只会额外增加4或8个字节而不会受到伤害。
如果分析显示shared_ptr
的实现仍然是您的应用程序的瓶颈,请考虑使用boost::intrusive_ptr
。还要查找通过引用而不是按值传递shared_ptrs,或者如果需要副本,则通过移动它们来传递它们。当然,如果你可以使用unique_ptr
,那么你应该更喜欢那些超过shared_ptr
s
答案 1 :(得分:0)
shared_ptr<A> sp( new A(), A_Deleter(), My_allocator<A>() );
template <typename T>
class My_allocator
{
...
T * allocate(const size_t n) const {
return singleton_pool<T,sizeof(T)>::malloc();
}
....
};
我认为你抱怨内存使用问题。我发现std allocator可以解决它;