我是否应该担心使用std :: vector进行内存碎片?如果是这样,有没有办法帮助防止它?我并不总是预测我的程序会在PC上运行,它们也可能在嵌入式设备/游戏机上运行,因此我总是无法依赖虚拟内存。
然后我再次相信使用动态大小的数组而不是静态数组会更有效,因此只有在需要时才会分配内存。它还可以简化我的程序'设计过程。有没有办法有效地实现这一目标?
感谢您的任何建议!
答案 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)
当你的探查者告诉你时,你应该总是担心性能和效率(你可以成为那个探查者,但你必须'测量',而不是猜测。)
你可以做的事情:
预分配容量:
std::vector<int> x(1000); // size() is 1000
std::vector<int> y;
y.reserve(1000); // size() is 0, capacity is 1000
使用自定义分配器
第一种选择显然是快速获胜;第二个选项更复杂,我只在你的堆分析器告诉你碎片导致问题时才推荐它。
对于堆分析,我建议
答案 4 :(得分:2)
使用std::vector
最小化重复内存分配和重新分配调用的一个好方法是,如果您已了解向量将使用多少元素,则可以自由使用std::vector::reserve()
。这将预先分配容量并防止在通过push_back()
添加元素时向量维护的内部数组的大小调整。
答案 5 :(得分:1)
不,std :: vector保证连续存储。您可以使用vector :: reserve()来避免重新分配,但矢量大小会增加。