什么是在堆上分配的最佳方式:小块或大块

时间:2015-06-23 05:07:40

标签: c++ memory heap

例如我有一个代码

for (int i = 0; i < 1000; ++i)
{
    Object obj = new Object();
    /* Manipulation */
}

最好的方法是:

  • 保留此版本并分配小件
  • 或者在开始时分配sizeof(Object) * 1000,然后使用

我需要在循环之外使用这个对象。

我正在考虑问题,当堆无法找到我所要求的大小的块时。

2 个答案:

答案 0 :(得分:1)

假设您希望对象的生命周期相同,则在分配和释放期间,一个较大的分配将节省一点时间。可能有理由不这样做,但一般情况下我建议在循环之前使用objects[i],然后在循环内修改for (Object& object : objects) ... ,甚至循环...

i

...如果您不需要code.其他任何内容。

答案 1 :(得分:0)

按照目前的情况,无论你如何分配,你的代码根本不会有效。您正在动态分配数千个字节,并且永远不会释放它们;如果你在循环中或外面进行它并不重要。在每次迭代中,您将在堆中占用更多未使用的字节。

现在,如果你使用堆栈分配,那么你的对象将在每次循环迭代后被隐式破坏,你不必担心手动解除分配。

但是事情是 - 你不需要分配sizeof(Object) * 1000字节,因为你的对象的范围是循环。如果你没有计划在循环之外访问对象(我不会想象你会这样做,因为你已经制作了成千上万的对象,而且你唯一能够保留访问权限的对象是最后一个),那么你只需要一个对象的空间。

C ++编译器实际上是自动执行此操作。调用函数时,它将为局部变量sizeof(Object)分配obj个字节,并且在每次迭代时,您只需覆盖相同的字节。

简而言之,您唯一需要担心的是在每次迭代后解除分配,这可以通过分配堆栈而不是堆来更简单地实现。

如果要在每次迭代结束时使用动态分配和delete,则会产生轻微的开销。堆中有sizeof(Object)个字节,堆栈上有4个字节用于指向堆的指针,即obj。在大多数情况下,4字节肯定可以忽略不计,但值得注意。

当然,为Object分配数千个字节比覆盖相同的几个字节要占用更多内存,尤其是如果您只想让生命周期成为一次迭代。