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

我们可以在c程序中使用太多的malloc和free吗,malloc,Malloc,在一个程序中调用太多malloc&free可以吗 我有一个做malloc的程序,每个记录都是免费的。虽然听起来很糟糕,但如果我使用了太多的malloc和free,会不会有性能问题?根据定义,“太多”就是“太多” 但更严重的是,在大多数系统上,堆分配相当快——因为它做了很多工作。每次处理记录时为其分配空间听起来不错 真正的答案是:编写你的程序并测量它的速度,它可以接受吗?如果没有,那么对其进行分析并找出瓶颈所在-my 10c说不会是堆处理根据定义,“太多”就是“太多” 但更严重的是,在大多数系统上

在一个程序中调用太多malloc&free可以吗


我有一个做malloc的程序,每个记录都是免费的。虽然听起来很糟糕,但如果我使用了太多的malloc和free,会不会有性能问题?

根据定义,“太多”就是“太多”

但更严重的是,在大多数系统上,堆分配相当快——因为它做了很多工作。每次处理记录时为其分配空间听起来不错


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

根据定义,“太多”就是“太多”

但更严重的是,在大多数系统上,堆分配相当快——因为它做了很多工作。每次处理记录时为其分配空间听起来不错

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

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

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

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

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

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

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

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

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

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


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

是/否。大量的malloc/free会导致堆碎片化,从而导致malloc失败。现在内存非常便宜,问题就不那么严重了。

是/否。大量malloc/free会导致堆碎片化,导致malloc失败。现在内存非常便宜,问题就不那么严重了。

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

这只是几个步骤,但对你的电脑来说并不是很多工作。使用malloc为您获取内存与在堆栈上放置变量之间的区别在于一系列指令和一个系统调用,以及