gpt4 book ai didi

c++ - shared_ptr 的对象池模式是否可能?

转载 作者:行者123 更新时间:2023-11-28 02:24:54 36 4
gpt4 key购买 nike

是否可以创建一个shared_ptr的对象池?在我的脑海中勾勒出这个草图,我可以看到两种方法,但每种方法都有一个缺陷:

  1. 如果 T 对象存储在可重用池中,则在 get() 请求时将 T 包装在 shared_ptr 中的行为将导致控制 block 每次都在堆上重新分配 - 因此打破了这个概念一个对象池。

  2. 如果 shared_ptr 对象存储在可重用池中,则 shared_ptr 对象必须停止存在才能启动自定义删除器,并且自定义删除器函数只能使用 T 指针调用。所以没有什么可回收的。

最佳答案

经过详尽的研究和测试后,我得出结论,没有合法的方法(从 C++11 或更低版本开始)创建可重用的对象池 shared_ptr<T>直接的。当然可以制作一个 T 的池子对象很容易服务 shared_ptr<T>的,但这会导致每次为控制 block 提供服务时进行堆分配。

不过, 可以创建 shared_ptr<T> 的对象池是间接的(这是我找到的唯一方式)。间接地,我的意思是必须实现一个自定义的“内存池”式分配器来存储在 shared_ptr<T> 时释放的内存以供重用。控制 block 被破坏。这个分配器随后被用作“shared_ptr”构造函数的第三个参数:

template< class Y, class Deleter, class Alloc > 
std::shared_ptr( Y* ptr, Deleter d, Alloc alloc );

shared_ptr<T>仍将使用堆内存构建/分配和删除/取消分配 - 无法阻止它 - 但通过自定义分配器使内存可重用,可以实现确定性的内存占用。

关于c++ - shared_ptr 的对象池模式是否可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31090302/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com