【发布时间】:2021-02-21 07:53:56
【问题描述】:
std::shared_ptr 在内部分配(::new)一个控制块(引用计数对象)在堆中。当共享 ptr 的引用计数变为零时,此控制块被释放(::delete)。 出于性能原因,我需要重新循环为此控制块分配的内存。
已接受对问题 Is an Object Pool pattern of shared_ptr possible? 的回答,表示自定义分配器应该可以解决问题。 但我不清楚为 Y 创建的分配器(Alloc)对象如何分配控制块
template< class Y, class Deleter, class Alloc > std::shared_ptr( Y* ptr, Deleter d, Alloc alloc );
有人可以请 指向为 std::shared_ptr 编写的自定义分配器的示例,它重新循环控制块对象
或
提供部分代码来循环控制块
或
解释Allocator<Y> 如何为std::shared_ptr template< class Y, class Deleter, class Alloc > 分配控制块
注意:我正在寻找不使用 boost::intrusive_ptr 的解决方案
【问题讨论】:
-
如果你使用
make_shared/allocate_shared,将只分配一个块。坚持这些,就没有什么可回收的了。 :-) -
shared_ptr构造函数采用分配器将使用allocator_traits::rebind_alloc获取用于控制块的某些内部类型的分配器。