我boost::intrusive_ptr
用来处理自动内存管理,但现在我想将它们与池对象分配结合使用。Boost Pool 会是一个很好的起点,还是有另一种普遍接受的使用“智能指针”进行池分配的做法?
问问题
415 次
1 回答
0
我想我写的正是你要找的东西:
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();
当引用计数下降表明缓冲区不再使用时,它会自动放回池中并且可以重用,缓冲区也会重置为其原始内存分配,以防你搞砸了(就像我上面所做的那样)在使用过程中。
于 2015-02-14T16:24:29.353 回答