【问题标题】:Creating an object pool创建对象池
【发布时间】:2013-10-05 12:22:25
【问题描述】:

我想使用类型 X 对象的向量创建一个对象 bool。当我创建向量时:

vector<X>* v = new vector<X>;
v.reserve(10000);

我希望尽可能少地完成工作。是否只会调用默认构造函数(对于 X,我的默认构造函数为空)?

稍后在我的程序中如何使用对象池“创建”我的对象?会不会是这样的:

int y = get_next_object_in_pool();
X x = v[y];

get_next_object_in_pool() 在哪里只保留指向向量中下一个空闲索引的索引?

【问题讨论】:

  • 注意写vector&lt;X&gt;* v = new vector&lt;X&gt;;vector&lt;X&gt; v();
  • 这段代码在几年前救了我一次:Object Pooling for Generic C++ classes 它对现有代码的干扰最小,因为您使用普通的newdelete 运算符从池中获取对象并将它们返回到。
  • @MassoodKhaari 感谢您指出我丢失的指针参考。
  • 现在你应该使用“->”而不是“.” :)

标签: c++ performance memory-management vector object-pooling


【解决方案1】:

不会调用 X 的构造函数,因为 Reserve 不会创建任何对象。不要将保留与调整大小混淆,它们会做不同的事情。我认为从您的其余描述中您确实想要保留,但请记住它使您的向量大小为 0。

当您想将对象添加到池中时,类似于

v.push_back(X());

假设你想添加一个默认的构造对象。

如果您想完全控制您的池,在您的池中使用任何旧的构造和非构造插槽的组合。那么你将不得不做其他事情。使用vector&lt;T&gt; 是无法做到的。

【讨论】:

  • 很酷,所以我只需使用我的非默认构造函数创建我的 X 对象,然后在何时 push_back 到向量。这将使我的 X 对象保持在连续的内存中?
  • @user997112 是的,vector 保证使用连续内存。
猜你喜欢
  • 2015-03-27
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 2021-07-04
相关资源
最近更新 更多