0 malloc
在程序中调用过多的malloc和free可以吗?
我有一个程序可以为每条记录执行 malloc 和 free 操作。虽然听起来很糟糕,但是如果我使用太多的 malloc 和 free 会不会有性能问题?
大多数现代malloc(3)实现都像内存池一样工作。由于大多数现代操作系统使用页面(通常为 4KB 大小)来处理内存,因此 malloc 可能会从操作系统请求至少 4KB。
假设您继续malloc使用 32 进行调用。在您的第一个 malloc 中,至少从操作系统请求一个新页面(通过sbrk(2)unix)。连续的 malloc 与操作系统无关,只要内存可用,它们只是返回内存池中的下一个空闲内存块。因此,malloc通常来说,多次拨打电话并不是什么大问题。这里的要点是系统调用(用户进程和操作系统之间的通信)通常是昂贵的,并且malloc尽力避免。
free也很相似。当您释放内存时,通常操作系统不会收到通知。当页面完全释放时,该页面可以返回给操作系统。某些实现不会将页面返回给操作系统,除非进程已经拥有许多未使用的页面。
总而言之,malloc和free就像处理任意大小的通用内存管理器一样。您可能面临的问题是,它malloc 被设计为处理任意大小的分配,这可能比设计为处理固定大小分配的内存管理器慢。如果您通常分配相同类型的内存,那么实现自己的内存池可能会更好。另一种情况是malloc在大多数现代实现中,调用涉及锁定/解锁以支持多线程。如果您使用单个线程,这也可能是一种开销:实现您自己的内存池的另一个原因。
您可能还想使用不同的 malloc 实现,对它们进行基准测试并决定使用其中之一。从干净的实现开始并去除不必要的部分在这里也可能是一个好主意。
| 归档时间: |
|
| 查看次数: |
1408 次 |
| 最近记录: |