0

我正在尝试通过使用 allocate_shared 来提高 boost::shared_ptr 的性能。问题是我不确定应该将哪种分配器准确传递给 boost::allocate_shared。

我有以下内容:

struct MagicalData {...};

// My simple allocator example 
template <typename T>
class MyAlloc
{
 public:

typedef T                 value_type;
typedef value_type*       pointer;
typedef const value_type* const_pointer;
typedef value_type&       reference;
typedef const value_type& const_reference;
typedef std::size_t       size_type;
typedef std::ptrdiff_t    difference_type;

template<typename U>
struct rebind {
    typedef MyAlloc<U> other;
};  

pointer allocate(size_type n, const_pointer = 0) {
    void* p = std::malloc(n * sizeof(T));
    if (!p)
      throw std::bad_alloc();
    return static_cast<pointer>(p);
}   

void deallocate(pointer p, size_type) {
    std::free(p);
}   

size_type max_size() const { 
    return static_cast<size_type>(-1) / sizeof(value_type);
}   
};

MyAlloc 分配;

// Compilation error
boost::shared_ptr<MagicalData> magicalData 
       = boost::allocate_shared<MagicalData>(alloc, j);

我在这里得到令人费解的编译错误:

/usr/include/boost-1_51/boost/smart_ptr/detail/shared_count.hpp:239:18: error: no matching function for call to ‘MyAlloc<boost::detail::sp_counted_impl_pda<MagicalData*, boost::detail::sp_ms_deleter<MagicalData>, MyAlloc<MagicalData> > >::MyAlloc(MyAlloc<MagicalData>&)'

有任何想法吗?

4

1 回答 1

0

看来我错过了这个。来自 wiki:分配器应该是可复制构造的。T 类型对象的分配器可以从 U 类型对象的分配器构造。如果分配器 A 分配内存区域 R,则 R 只能由比较等于 A 的分配器释放。 [11 ]

于 2013-04-08T18:05:15.200 回答