2015-06-22 81 views
2

我试图在Windows 7上实现C中的一些数学算法,并且需要反复增加我的数组大小。在循环中调用realloc的缺点

有时会失败,因为realloc无法分配内存。 但是,如果我在开始时一次分配大量内存,它会正常工作。

这是内存管理器的问题吗?任何人都可以解释我这个吗?

+1

为什么不使用stl容器?例如,“std :: vector”或“std :: dequeue”?或者'C++'标签意外。 –

+0

好吧,假设你有一个500MB大小的数组,你想增长100MB。您需要1100MB才能做到这一点,因为首先创建了一个600MB的新数组,将数据复制到新阵列,然后释放旧阵列。首先分配一个600MB的阵列只需要600MB。所以你有更大的机会用完内存或者用realloc来解决空间问题。 – nos

+0

如果您可以预先计算需要多少空间,那么预分配速度无论如何都会更快(这也适用于STL容器)。 – Simon

回答

1
  1. 当您多次分配/释放内存时,它可能会在内存中创建分段并且您可能无法获得大量连续的内存块。
  2. 当你做一个realloc时,短时间内需要一些额外的内存可能来移动数据。

如果你的算法不需要连续的内存,或者可以改变为在不连续的内存上工作,可以考虑使用数组的链表(可以避免复制数据的某些链接std :: dequeue)你的代码可能不会遭受OOM。如果您知道阵列的最坏情况内存需求,最好从开始时分配内存,因为与realloc相比,这样可以避免分配和数据移动的成本。

0

我希望你的算法能够快速工作,尽量做前面所有的内存分配。内存分配是一个无限制的操作,会导致你的性能下降。因此推测一个合理的最坏情况,并为此分配足够的。如果你确实需要稍后重新分配,但不要连续这样做。