Nic*_*las 2 c++ shared-ptr object-pooling c++11
是否可以创建shared_ptr的对象池?在我的脑海中勾勒出这一点,我可以看到两种方法可以做到这一点,但每种方法都有一个缺陷:
如果 T 对象存储在可重用池中,则在 get() 请求上将 T 包装在 Shared_ptr 中的行为将导致每次在堆上重新分配控制块 - 因此打破了对象池的概念。
如果shared_ptr对象存储在可重用池中,则shared_ptr对象必须停止存在才能启动自定义删除器,并且只能使用T指针调用自定义删除器函数。所以没有什么可以回收的。
经过详尽的研究和测试,我得出的结论是,没有合法的方法(从 C++11 或更低版本开始)shared_ptr<T>直接创建可重用的对象池。当然,我们可以T很容易地创建一个服务的对象池shared_ptr<T>,但这会导致每次服务都为控制块分配堆。
然而,可以间接创建 的对象池(这是我发现的唯一方法)。间接地,我的意思是必须实现一个自定义的“内存池”样式分配器来存储控制块被销毁时释放的内存以供重用。然后,该分配器用作“shared_ptr”构造函数的第三个参数:shared_ptr<T>shared_ptr<T>
template< class Y, class Deleter, class Alloc >
std::shared_ptr( Y* ptr, Deleter d, Alloc alloc );
Run Code Online (Sandbox Code Playgroud)
仍将shared_ptr<T>使用堆内存来构造/分配和删除/取消分配 - 无法阻止它 - 但通过自定义分配器使内存可重用,可以实现确定性的内存占用。
| 归档时间: |
|
| 查看次数: |
4868 次 |
| 最近记录: |