在循环中调用realloc的缺点

我试图在Windows 7上用C实现一些数学算法,我需要反复增加我的数组的大小。

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

这是内存管理器的问题吗? 有人能解释一下吗?

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

如果您的算法不需要连续内存或者可以更改为在非连续内存上工作,请考虑使用数组的链接列表(C ++的Something链接std :: dequeue),这将避免复制数据,并且您的代码可能不会受到OOM的影响。 如果您知道arrays的最坏情况内存要求,最好保留从开头本身分配的内存,因为与realloc相比,它将避免分配和数据移动的成本。

我希望你的算法能够快速运行,尽量预先做好所有的内存分配。 内存分配是一种无限制的操作,会破坏您的性能。 因此,推测一个合理的最坏情况,并为此分配足够的。 如果你确实需要稍后重新分配,但不要继续这样做。