我应该担心std :: vector的内存碎片吗?

时间:2011-10-31 15:26:32

标签: c++ stl vector

我是否应该担心使用std :: vector进行内存碎片?如果是这样,有没有办法帮助防止它?我并不总是预测我的程序会在PC上运行,它们也可能在嵌入式设备/游戏机上运行,​​因此我总是无法依赖虚拟内存。

然后我再次相信使用动态大小的数组而不是静态数组会更有效,因此只有在需要时才会分配内存。它还可以简化我的程序'设计过程。有没有办法有效地实现这一目标?

感谢您的任何建议!

6 个答案:

答案 0 :(得分:11)

您担心的答案可能是std::deque。它为您提供了与std::vector类似的接口,但是对于碎片化内存效果更好,因为它分配了几个小数组而不是大数组。在某些方面,它实际上效率低于std::vector,但对于您的情况,它可能是一个很好的权衡。

答案 1 :(得分:5)

如果您的矢量将被重新分配多次,那么它可能会导致内存碎片。 如果你或多或少知道你的数组有多大,那么避免这种情况的最简单方法就是使用std::vector::reserve()

你也可以考虑使用std::deque而不是vector,这样你就不会遇到内存碎片问题。

以下是stackoverflow的主题,对您来说很有意思:what-is-memory-fragmentation

答案 2 :(得分:3)

std :: vector和新的一样好。它只是为您处理底层内存分配 您可以做的一些事情 - 假设您不想编写全新的处理程序。

预先分配矢量或调整大小(),如果你知道它们的最终大小,这会在它们增长时停止浪费的内存副本。

如果您要再次使用相同大小的矢量,最好保留它并重新填充它,而不是删除它并重新创建它。

通常在嵌入式目标上,如果你知道内存要求,最好在开始时静态分配所有内存并自己进行分割 - 这不像其他用户想要的那样。

答案 3 :(得分:2)

当你的探查者告诉你时,你应该总是担心性能和效率(你可以成为那个探查者,但你必须'测量',而不是猜测。)

你可以做的事情:

  1. 预分配容量:

     std::vector<int> x(1000); // size() is 1000
    
     std::vector<int> y;
     y.reserve(1000); // size() is 0, capacity is 1000
    
  2. 使用自定义分配器

  3. 第一种选择显然是快速获胜;第二个选项更复杂,我只在你的堆分析器告诉你碎片导致问题时才推荐它。

    对于堆分析,我建议

答案 4 :(得分:2)

使用std::vector最小化重复内存分配和重新分配调用的一个好方法是,如果您已了解向量将使用多少元素,则可以自由使用std::vector::reserve()。这将预先分配容量并防止在通过push_back()添加元素时向量维护的内部数组的大小调整。

答案 5 :(得分:1)

不,std :: vector保证连续存储。您可以使用vector :: reserve()来避免重新分配,但矢量大小会增加。