我们可以在c程序中使用太多的malloc和free

时间:2015-02-02 23:37:51

标签: malloc

可以调用太多的malloc&在节目中免费?

我有一个程序可以为每条记录执行malloc和free。虽然听起来很糟糕,但是如果我使用太多的malloc和免费的话会有性能问题吗?

4 个答案:

答案 0 :(得分:2)

大多数现代malloc(3)实现都像内存池一样工作。由于大多数现代操作系统都使用页面处理内存(通常为4KB大小),因此malloc可能会从操作系统请求至少4KB。

假设你继续用32调用malloc。在你的第一个malloc中,从操作系统请求至少一个新页面(通过unix上的sbrk(2))。连续的mallocs与操作系统无关,只要内存可用,它们就会返回内存池中的下一个空闲内存块。因此,通常多次调用malloc并不是什么大问题。这里的要点是系统调用(用户进程和操作系统之间的通信)通常很昂贵,malloc尽可能地尽量避免。{/ p>

free也是类似的。当你释放内存时,通常不会通知操作系统。当页面完全释放时,页面可能返回到操作系统。某些实现不会将页面返回到操作系统,除非该进程已经存在许多未使用的页面。

总结一下,mallocfree就像使用任意大小的通用内存管理器一样。您可能遇到的问题是malloc 旨在使用任意大小的分配,这可能比设计用于固定大小分配的内存管理器慢。如果您通常分配相同类型的内存,那么实现自己的内存池可能会更好。另一种情况是malloc调用涉及大多数现代实现中的锁定/解锁以支持多线程。如果您正在使用单个线程,那么这可能也是一种开销:实现自己的内存池的另一个原因。

您可能还希望使用不同的malloc实现,对它们进行基准测试并决定使用其中任何一个。从干净的实现开始并剥离不必要的部分也可能是一个好主意。

答案 1 :(得分:1)

是/否。大量的malloc / free会导致堆碎片化到malloc可能失败的程度。现在内存相当便宜,这不是一个问题。

答案 2 :(得分:1)

调用malloc时有一些开销,但不是很多。 malloc基本上必须遍历堆并找到一块未使用的内存块,其大小足以容纳您要求的字节数,然后它将该块指定为已使用并告诉操作系统{{ 1}}它为你并返回指向该块的指针。

这是几个步骤,但对你的电脑来说真的不是很多工作。使用malloc为你获取内存和在堆栈上放置变量之间的区别是一些指令和一个系统调用,除非你在嵌入式系统上编程,否则你真的不应该担心它。如果分配的内存太多而实际上用完RAM,那么你只会获得真正的性能提升(在这种情况下,你的虚拟内存管理器必须将一些东西移动到交换空间以腾出更多空间 - 事实证明, malloc never fails)!

释放内存比分配内存更容易,最终最好释放你分配的内容(未来mmap调用会更快,更多内存可用。)

总之,使用malloc来表达你的内心!数十年的技术进步一直在努力为你赢得这样的权利,没有理由浪费它!

答案 3 :(得分:0)

根据定义,太多'是太多了#39;

但更严重的是,在大多数系统上,堆分配速度相当快 - 因为它已经完成很多。每次处理时都要为记录分配空间并不是坏事。

真正的答案是:编写程序并测量其速度,是否可以接受?如果没有,那么然后对其进行分析并找出瓶颈所在 - 我的10c表示它不会被堆处理