1

我正在尝试使用 boost::object_pool 将内存分配给包含向量作为成员变量的类型的对象。

class X{
std::vector<Type> v1;
std::vector<Type> v2;

int a;
double b;
..
};


void func()
{
      boost::object_pool<X> p;
      for (int i = 0; i < 10000; ++i)
      {
        X * const t = p.malloc();

      }
}

现在 boost::object_pool 的构造函数使用 sizeof(X) 来查找 X 的大小,因此它无法确定成员变量 v1 和 v2 会在运行时增长。

  1. 我猜测它可能会导致将对象复制到不同的位置,这将导致性能损失,而不是加速它,这是使用内存池的目的。我的猜测正确吗?如果不是,当 v1 和 v2 在运行时增长时还会发生什么?

  2. 类型向量(或在运行时增长的任何其他类型)的成员变量是如何在内存中放置的?对象是否包含指向堆中向量的指针而不是向量本身?如何确保当向量增长时,它们使用池中的内存?

  3. 我在运行时创建了很多 X 类型的对象。boost::object_pool 是在这种情况下使用的适当接口吗?如果不是,我该如何解决这个问题?

谢谢

4

2 回答 2

3

sizeof(v1) 和 sizeof(v2) 在运行时不会增长。他们在内部使用指针和堆分配。

如果您需要分配大量相同类型的对象,并且能够一次快速删除它们,那么池是合适的。

于 2012-04-25T14:11:53.753 回答
2

你有一些不正确的假设。因为底层数组在std::vector堆上,所以sizeof()永远不会改变。中不应该有任何复制boost::object_pool。至于这是否适合您,这取决于您计划创建和销毁X对象的频率。

于 2012-04-25T14:14:39.523 回答