我有一个图像压缩应用程序,它现在有两个不同版本的内存分配系统。在最初的版本中,malloc 无处不在,而在第二个版本中,我实现了一个简单的池分配器,它只分配一块内存并将部分内存返回给 myalloc() 调用。
我们注意到使用 malloc 时内存开销巨大:在内存使用高峰期,malloc() 代码需要大约 170 兆字节的内存来处理 1920x1080x16bpp 的图像,而池分配器仅分配 48 兆字节,其中 47被程序使用。
在内存分配模式方面,程序为测试图像分配了大量的 8 字节(大多数)、32 字节(很多)和 1080 字节(一些)的块。除此之外,代码中没有动态内存分配。
测试系统操作系统为Windows 7(64位)。
我们如何测试内存使用情况?
使用自定义分配器,我们可以看到使用了多少内存,因为所有 malloc 调用都被推迟到分配器。使用 malloc(),在调试模式下,我们只是单步执行代码并在任务管理器中观察内存使用情况。在发布模式下,我们做了同样的事情,但粒度不那么细,因为编译器优化了很多东西,所以我们不能逐段执行代码(发布和调试之间的内存差异大约是 20MB,我将其归因于优化和发布模式下缺少调试信息)。
malloc 是否会导致如此巨大的开销?如果是这样,究竟是什么导致了 malloc 内部的这种开销?