循环调用realloc的缺点

Disadvantages of calling realloc in a loop

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

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

是不是内存管理器的问题?谁能给我解释一下吗?

  1. 当你多次 allocate/deallocate 内存时,它可能会在内存中产生碎片,你可能无法获得大的连续内存块。
  2. 当您执行重新分配时,可能可能需要一些额外的内存来移动数据。

如果您的算法不需要连续内存或可以更改为在非连续内存上工作,请考虑使用 linked-lists of array (Something link std::dequeue of C++),这将避免复制数据,并且您的代码可能不会遭受 OOM。如果您知道数组最坏情况下的内存需求,最好保留从一开始就分配的内存本身,因为与 realloc.

相比,它可以避免分配和数据移动的成本。

如果您希望您的算法运行得更快,请尝试预先分配所有内存。内存分配是一个无限制的操作,会降低你的性能。因此,推测一个合理的最坏情况并为此分配足够的资金。如果您确实需要稍后重新分配,但不要连续这样做。