【问题标题】:How to specify the allocator with boost::allocate_shared?如何使用 boost::allocate_shared 指定分配器?
【发布时间】:2013-04-08 17:10:43
【问题描述】:

我正在尝试通过使用 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&lt;boost::detail::sp_counted_impl_pda&lt;MagicalData*, boost::detail::sp_ms_deleter&lt;MagicalData&gt;, MyAlloc&lt;MagicalData&gt; &gt; &gt;::MyAlloc(MyAlloc&lt;MagicalData&gt;&amp;)'

有什么想法吗?

【问题讨论】:

  • 您的MagicalData 默认可构造吗?
  • 是的,默认构造和复制构造。
  • 等一下,这些都不应该编译,因为你在上千个地方都缺少typename...
  • 所有定义都直接内联到类中,所以我认为我不需要 typename。

标签: c++ performance memory


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多