使用 boost void 分配器是不好的做法吗?
Is using a boost void allocator bad practice?
我看到有时人们使用这样定义的通用 void 分配器:
using namespace boost::interprocess;
typedef allocator<void, managed_shared_memory::segment_manager> VoidAllocator;
这被认为是一种不好的做法吗?我发现 std::allocator 已经贬值了,我应该关注 boost 版本吗?
我不认为这是不好的做法,但主要是无用的做法。
void
的 allocator
不能分配任何东西,也没有任何有用的特征。
所以最后它只对重新绑定有用。
如果你重新绑定,你实际上可以用 char
替换 void
。
也许有一个 "symmetry" 论据来拥有一个 void
分配器,但它会造成混淆,因为没有 reference
、size_type
或其他典型特征成员。
(重新绑定分配器的想法首先很奇怪,可能是旧语言限制的残余。分配器不需要知道它们正在分配的类型,因为最好的情况是多余的,最坏的情况下容器通常重新绑定到它真正需要的类型——例如节点类型——。)
是的,std::allocator<void>
现在不受欢迎的原因也适用于其他声称是 "allocators of void" 的事物。
根据p0174r0
Similarly, std::allocator<void>
is defined so that various template
rebinding tricks could work in the original C++98 library, but it is
not an actual allocator, as it lacks both allocate
and deallocate
member functions, which cannot be synthesized by default from
allocator_traits
. That need went away with C++11 and the
void_pointer
and const_void_pointer
type aliases in
allocator_traits
. However, we continue to specify it in order to
avoid breaking old code that has not yet been upgraded to support
generic allocators, per C++11.
您可以轻松定义模板别名。
using namespace boost::interprocess;
template <typename T>
using segment_allocator = allocator<T, managed_shared_memory::segment_manager>;
我看到有时人们使用这样定义的通用 void 分配器:
using namespace boost::interprocess;
typedef allocator<void, managed_shared_memory::segment_manager> VoidAllocator;
这被认为是一种不好的做法吗?我发现 std::allocator 已经贬值了,我应该关注 boost 版本吗?
我不认为这是不好的做法,但主要是无用的做法。
void
的 allocator
不能分配任何东西,也没有任何有用的特征。
所以最后它只对重新绑定有用。
如果你重新绑定,你实际上可以用 char
替换 void
。
也许有一个 "symmetry" 论据来拥有一个 void
分配器,但它会造成混淆,因为没有 reference
、size_type
或其他典型特征成员。
(重新绑定分配器的想法首先很奇怪,可能是旧语言限制的残余。分配器不需要知道它们正在分配的类型,因为最好的情况是多余的,最坏的情况下容器通常重新绑定到它真正需要的类型——例如节点类型——。)
是的,std::allocator<void>
现在不受欢迎的原因也适用于其他声称是 "allocators of void" 的事物。
根据p0174r0
Similarly,
std::allocator<void>
is defined so that various template rebinding tricks could work in the original C++98 library, but it is not an actual allocator, as it lacks bothallocate
anddeallocate
member functions, which cannot be synthesized by default fromallocator_traits
. That need went away with C++11 and thevoid_pointer
andconst_void_pointer
type aliases inallocator_traits
. However, we continue to specify it in order to avoid breaking old code that has not yet been upgraded to support generic allocators, per C++11.
您可以轻松定义模板别名。
using namespace boost::interprocess;
template <typename T>
using segment_allocator = allocator<T, managed_shared_memory::segment_manager>;