将升压内存池与以向量作为成员变量的类一起使用

Using boost memory pool with a class with vectors as member variables

本文关键字:变量 成员 一起 内存 向量      更新时间:2023-10-16

我正在尝试使用 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. 向量(或在运行时增长的任何其他类型)的成员变量如何在内存中放置?对象是否包含指向堆中的向量的指针,而不是向量本身?如何确保当向量增长时,它们使用池中的内存?

  4. 我在运行时创建了很多 X 类型的对象。boost::object_pool 是否是在此方案中使用的合适接口?如果不是,我该如何处理这个问题?

谢谢

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

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

你有一些不正确的假设。由于 std::vector 中的基础数组位于堆上,因此sizeof()永远不会更改。boost::object_pool根本不应该有任何复制.至于这是否适合您,这取决于您计划创建和销毁X对象的频率。