我试图在Windows 7上实现C
中的一些数学算法,并且需要反复增加我的数组大小。在循环中调用realloc的缺点
有时会失败,因为realloc
无法分配内存。 但是,如果我在开始时一次分配大量内存,它会正常工作。
这是内存管理器的问题吗?任何人都可以解释我这个吗?
我试图在Windows 7上实现C
中的一些数学算法,并且需要反复增加我的数组大小。在循环中调用realloc的缺点
有时会失败,因为realloc
无法分配内存。 但是,如果我在开始时一次分配大量内存,它会正常工作。
这是内存管理器的问题吗?任何人都可以解释我这个吗?
如果你的算法不需要连续的内存,或者可以改变为在不连续的内存上工作,可以考虑使用数组的链表(可以避免复制数据的某些链接std :: dequeue)你的代码可能不会遭受OOM。如果您知道阵列的最坏情况内存需求,最好从开始时分配内存,因为与realloc
相比,这样可以避免分配和数据移动的成本。
我希望你的算法能够快速工作,尽量做前面所有的内存分配。内存分配是一个无限制的操作,会导致你的性能下降。因此推测一个合理的最坏情况,并为此分配足够的。如果你确实需要稍后重新分配,但不要连续这样做。
为什么不使用stl容器?例如,“std :: vector”或“std :: dequeue”?或者'C++'标签意外。 –
好吧,假设你有一个500MB大小的数组,你想增长100MB。您需要1100MB才能做到这一点,因为首先创建了一个600MB的新数组,将数据复制到新阵列,然后释放旧阵列。首先分配一个600MB的阵列只需要600MB。所以你有更大的机会用完内存或者用realloc来解决空间问题。 – nos
如果您可以预先计算需要多少空间,那么预分配速度无论如何都会更快(这也适用于STL容器)。 – Simon