【问题标题】:Pooled Allocator + boost::intrusive_ptr池化分配器 + boost::intrusive_ptr
【发布时间】:2013-08-06 05:47:58
【问题描述】:

我使用boost::intrusive_ptr 来处理自动内存管理,但现在我想将它们与池对象分配结合使用。 Boost Pool 会是一个很好的起点,还是有另一种普遍接受的使用“智能指针”进行池分配的做法?

【问题讨论】:

  • 我已经写了一个关于 boost::pool: stackoverflow.com/a/17671067/1918154 的另一个问题的答案。所以我的建议是不要使用它。
  • 这些都是独立的事情。如果您使用默认值覆盖 new/delete boost::intrusive_ptr 将毫无问题。
  • @JanHerrmann,感谢您的链接。我想我将根据我的特定用例使用自定义分配器。 @MaximYegorushkin,我担心覆盖 new/delete 可能有点不灵活。我喜欢boost::intrusive_ptr 是一个“选择加入”策略,即您可以选择是否在运行时使用内存管理。我可以看到我希望池化实例和 new'd 实例都存在于同一个应用程序中的情况......

标签: c++ boost smart-pointers


【解决方案1】:

我想我写的正是你要找的东西:

https://github.com/cdesjardins/QueuePtr

它基本上是一个线程安全队列,在初始化时填充内存缓冲区:

boost::shared_ptr<RefCntBufferPool> pool(new RefCntBufferPool(700, 1024));

你有一个 shared_ptr 指向一个有 700 个缓冲区的池,每个缓冲区是 1024 字节。

那么就可以得到一个缓冲区了:

boost::intrusive_ptr<RefCntBuffer> x;
pool->dequeue(x);

用它做你喜欢的事,这里有一些例子:

boost::intrusive_ptr<RefCntBuffer> y;
y = x;
y->_buffer = boost::asio::buffer(y->_buffer + 10, 100);
boost::asio::buffer_copy(y->_buffer, boost::asio::buffer("hello"));
x.reset();

当引用计数下降以指示缓冲区不再使用时,它会自动放回池中并可以重复使用,缓冲区也会重置为原始内存分配,以防你搞砸了(因为我上面做了)在使用过程中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2018-06-08
    • 2012-04-09
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多