使用boost void分配器是不好的做法吗?

时间:2018-08-01 07:05:06

标签: c++ boost allocator boost-interprocess

我已经看到有时候人们会使用这样定义的通用void分配器:

using namespace boost::interprocess;
typedef allocator<void, managed_shared_memory::segment_manager> VoidAllocator;

是否认为这是一种不好的做法?我发现std :: allocator已贬值,我应该关注boost版本吗?

2 个答案:

答案 0 :(得分:2)

是的,std::allocator<void>现在不受欢迎的原因也适用于其他被称为“无效分配者”的事物。

根据p0174r0

  

类似地,std::allocator<void>被定义为各种模板   重新绑定的技巧可能在原始的C ++ 98库中起作用,但是它是   不是实际的分配器,因为它既缺少allocate也缺少deallocate   成员函数,默认情况下无法从   allocator_traits。 C ++ 11和   void_pointerconst_void_pointer中的别名   allocator_traits。但是,我们继续指定它是为了   避免破坏尚未升级为支持的旧代码   通用分配器,根据C ++ 11。

您可以轻松定义模板别名。

using namespace boost::interprocess;
template <typename T>
using segment_allocator = allocator<T, managed_shared_memory::segment_manager>;

答案 1 :(得分:1)

我认为这不是一个坏习惯,但大多数情况下是没有用的。

allocator中的void无法分配任何内容,也没有任何有用的特征。 因此,最后它仅对重新绑定有用。 而且,如果您要重新绑定,则实际上可以将void替换为char

也许会有一个“对称”参数来拥有一个void分配器,但是由于没有referencesize_type或其他典型特征成员,这会造成混乱。

(重新绑定分配器的想法首先很奇怪,可能是旧语言的局限性。分配器不需要知道他们正在分配的类型,因为充其量是多余的,最坏的情况是容器通常重新绑定到仍然需要的类型(例如节点类型)。