【问题标题】:Using boost memory pool with a class with vectors as member variables使用带有向量作为成员变量的类的 boost 内存池
【发布时间】:2012-05-06 05:48:21
【问题描述】:

我正在尝试使用 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 是在这种情况下使用的适当接口吗?如果不是,我应该如何解决这个问题?

谢谢

【问题讨论】:

    标签: c++ memory-management


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我分配了许多相同类型的对象。如何确保当向量增长时,它们使用池中的内存?
    • boost 还有一个 fast_pool_allocator 供 vector 使用。如果您一遍又一遍地分配和删除大量向量,它可能会提高性能。矢量已经非常有效,所以我会小心并测量它。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-08-05
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 2011-07-16
      相关资源
      最近更新 更多