循环调用realloc的缺点
Disadvantages of calling realloc in a loop
我正在尝试在 Windows 7 上的 C
中实现一些数学算法,我需要反复增加数组的大小。
有时会失败,因为realloc
无法分配内存。
但是如果我一开始就一次分配大量内存,它就可以正常工作。
是不是内存管理器的问题?谁能给我解释一下吗?
- 当你多次 allocate/deallocate 内存时,它可能会在内存中产生碎片,你可能无法获得大的连续内存块。
- 当您执行重新分配时,可能可能需要一些额外的内存来移动数据。
如果您的算法不需要连续内存或可以更改为在非连续内存上工作,请考虑使用 linked-lists of array (Something link std::dequeue of C++),这将避免复制数据,并且您的代码可能不会遭受 OOM。如果您知道数组最坏情况下的内存需求,最好保留从一开始就分配的内存本身,因为与 realloc
.
相比,它可以避免分配和数据移动的成本。
如果您希望您的算法运行得更快,请尝试预先分配所有内存。内存分配是一个无限制的操作,会降低你的性能。因此,推测一个合理的最坏情况并为此分配足够的资金。如果您确实需要稍后重新分配,但不要连续这样做。
我正在尝试在 Windows 7 上的 C
中实现一些数学算法,我需要反复增加数组的大小。
有时会失败,因为realloc
无法分配内存。
但是如果我一开始就一次分配大量内存,它就可以正常工作。
是不是内存管理器的问题?谁能给我解释一下吗?
- 当你多次 allocate/deallocate 内存时,它可能会在内存中产生碎片,你可能无法获得大的连续内存块。
- 当您执行重新分配时,可能可能需要一些额外的内存来移动数据。
如果您的算法不需要连续内存或可以更改为在非连续内存上工作,请考虑使用 linked-lists of array (Something link std::dequeue of C++),这将避免复制数据,并且您的代码可能不会遭受 OOM。如果您知道数组最坏情况下的内存需求,最好保留从一开始就分配的内存本身,因为与 realloc
.
如果您希望您的算法运行得更快,请尝试预先分配所有内存。内存分配是一个无限制的操作,会降低你的性能。因此,推测一个合理的最坏情况并为此分配足够的资金。如果您确实需要稍后重新分配,但不要连续这样做。