我正在尝试使用 aboost::pool_allocator
来(有效地)分配std::shared_ptr<T>
。从概念上讲,我想要这样的东西:
struct Foo {};
std::shared_ptr<Foo> create() {
static boost::pool_alloator<Foo> alloc;
return std::allocate_shared<Foo>(alloc);
}
这个例子有一个问题:boost::pool_allocator<Foo>
针对大小分配进行了优化sizeof(Foo)
(事实上,我很惊讶它完全支持不同大小的分配......)。但std::allocate_shared<Foo>(…)
不分配字节,因为它一次性sizeof(Foo)
分配控制块和有效负载。
为了有效地使用boost::pool_allocator<…>
with std::allocate_shared
,我需要告知pool_allocator
预期分配的大小。为此,我可能需要allocate_shared
内部分配的类型。我非常确定,对于 GCC 的 STL 实现,该类型将是_Sp_counted_ptr_inplace,而对于 Clang 的 libc++ 来说,它看起来是__shared_ptr_emplace::_Storage - 但使用这些类型显然是不可移植的。
是否有任何符合标准的方法来计算将执行的分配大小std::allocate_shared
?或者任何其他方式(有效地)使用池分配器allocate_shared
?
分配器将重新绑定到它正在分配的任何内容的内部类型,并使用具有适当类型的分配器的副本。
pool_allocator<Foo>
有点误导,因为它反弹到更大的类型。通常,allocator<void>
当您知道它会反弹时,您可以使用:通过这种方式,您可以确定不需要做额外的工作来处理从未实际使用过的较小尺寸对象的分配器