boost文档(http://www.boost.org/doc/libs/1_55_0/doc/html/intrusive.html)指出侵入式容器是为list(单/双链接)set和multiset.我找不到地图的实现.有没有更深层次的理由,还是只是等待实施?
我一直在使用 boost object_pool 一段时间,并且对结果总体上感到满意。以前我主要是分配单个对象,但很少单独释放它们,只是一次释放整个池。最近,当我遇到需要从池中释放许多对象时,我发现它非常慢。
显然 pool 正在搜索已发布的块列表以链接新发布的对象。该文档讨论了有序和无序池,并提到了 pool_allocator 和 fast_pool_allocator。无序池(使用 fast_memory_allocator)在释放内存块方面可能会快得多。但是,我看不到如何使用它。
我是否正确理解我只能在 pool_allocator 和 fast_pool_allocator 之间选择与 boost::singleton_pool 而不是 boost::object_pool ?
下面是一个说明问题的小测试程序。它是用 VS2013 和 boost 1_57_0 构建的。测试在对象池中分配 n 个对象,然后随机释放 10%。它有一些粗略的计时工具,表明对于 n == 100,000,分配需要 0.004 秒,而释放需要 0.4 秒。同时,对于 n == 1,000,000,在我的机器上分配需要 0.022 秒,释放需要 42 秒。
#include <boost/pool/object_pool.hpp>
#include "time.h"
#include <vector>
#include <random>
struct foo {
int data[10];
};
struct test {
test(unsigned n) : size{ n } {}
void run();
float elapsedSec(clock_t& watch);
unsigned size;
boost::object_pool<foo> _pool;
float mallocSec;
float freeSec; …Run Code Online (Sandbox Code Playgroud)