gpt4 book ai didi

c - Malloc 与自定义分配器 : Malloc has a lot of overhead. 为什么?

转载 作者:IT王子 更新时间:2023-10-28 23:33:11 25 4
gpt4 key购买 nike

我有一个图像压缩应用程序,它现在有两个不同版本的内存分配系统。在最初的版本中,malloc 无处不在,而在第二个版本中,我实现了一个简单的池分配器,它只分配一 block 内存并将部分内存返回给 myalloc() 调用。

我们注意到使用 malloc 时会产生巨大的内存开销:在内存使用高峰期,malloc() 代码需要大约 170 兆字节的内存来处理 1920x1080x16bpp 的图像,而池分配器只分配 48 兆字节,其中 47 个被程序使用。

在内存分配模式方面,程序为测试图像分配了很多 8 字节(大多数)、32 字节(很多)和 1080 字节(一些)的 block 。除此之外,代码中没有动态内存分配。

测试系统操作系统为Windows 7(64位)。

我们如何测试内存使用情况?

使用自定义分配器,我们可以看到使用了多少内存,因为所有 malloc 调用都推迟到分配器。使用 malloc(),在 Debug模式下,我们只是单步执行代码并在任务管理器中观察内存使用情况。在 Release模式下,我们做了同样的事情,但粒度不那么细,因为编译器优化了很多东西,所以我们不能逐段执行代码(发布和调试之间的内存差异大约是 20MB,我将其归因于优化和 Release模式下缺少调试信息)。

难道只有 malloc 是造成如此巨大开销的原因吗?如果是这样,究竟是什么导致了 malloc 内部的这种开销?

最佳答案

在 Windows 7 上,您将总是获得低碎片堆分配器,而无需显式调用 HeapSetInformation() 来请求它。该分配器会牺牲虚拟内存空间来减少碎片。您的程序实际上并没有使用 170 兆字节,您只是看到周围有一堆空闲 block ,等待类似大小的分配。

这个算法非常很容易被自定义分配器击败,它不会做任何事情来减少碎片。这可能对您很有效,尽管在您保持程序运行时间超过单个调试 session 之前,您不会看到它的副作用。如果这是预期的使用模式,您确实需要确保它在数天或数周内保持稳定。

最好的办法就是不要为此烦恼,170 MB 简直是小菜一碟。请记住,这是虚拟内存,不需要任何费用。

关于c - Malloc 与自定义分配器 : Malloc has a lot of overhead. 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13064850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com