【发布时间】:2015-08-25 15:21:50
【问题描述】:
我试图了解 boost::pool 块预分配的策略。我阅读了 this 和 this boost 文档,但我仍然不清楚是否可以请求特定的初始实例化池时预分配的块数。当我说“块”时,我的意思是块 = sizeof(SomeType) 例如,我做了这个测试:
Foo.h
class Foo
{
public:
typedef MAllocator<float> FloatPoolAllocator;
typedef std::shared_ptr<boost::pool<> > FloatPoolSP;
static FloatPoolSP _floatPoolSP;
static FloatPoolAllocator _floatAllocator;
std::vector<float, FloatPoolAllocator> data1;
std::vector<float, FloatPoolAllocator> data2;
std::vector<float, FloatPoolAllocator> data3;
};
Foo.cpp
std::shared_ptr<boost::pool<> > Foo::_floatPoolSP = std::shared_ptr<boost::pool<> >(new boost::pool<>(sizeof(uint8_t), 65536));
MAllocator<float> Foo::_floatAllocator = MAllocator<float>(_floatPoolSP);
Foo::Foo()
{
data1 = std::vector<float, FloatPoolAllocator>(_floatAllocator);
data2 = std::vector<float, FloatPoolAllocator>(_floatAllocator);
data3 = std::vector<float, FloatPoolAllocator>(_floatAllocator);
}
现在,我希望我的进程内存至少是指定 boost::pool 大小的两倍,因为我还在不同地方分配了其他池,块大小从 4 到 16 mb 不等。仅这个池就是 64 mb 并查看 Windows 任务管理器(不是调查内存的最佳工具......)我看到总内存消耗约为 78 mb。它让我认为 boost::pool 没有分配块大小65536,至少不是第一次。这是真的吗?如果是,这是否意味着我需要包装自己的池以允许这样的功能?因为我没有在池中找到任何允许另一种方式的东西这样做。
PS:如果我删除池,我会看到进程使用的内存量几乎相同,这可能再次意味着 boost::pool 分配了非常小的块。
【问题讨论】: