我有一个图像压缩应用程序,它现在具有两个不同版本的内存分配系统。在原始版本中,malloc被广泛使用,在第二个版本中,我实现了一个简单的池分配器,它只分配一块连续的内存并将该内存的部分返回给myalloc()调用。
当使用malloc时,我们注意到有巨大的内存开销:在其内存使用高峰期,malloc()代码为1920x1080x16bpp图像需要约170兆字节的内存,而池分配器仅分配了48兆字节,其中47兆字节由程序使用。
就内存分配模式而言,该程序使用测试图像大量分配8字节(最多)、32字节(较多)和1080字节块(一些)。除此之外,代码中没有动态内存分配。
测试系统的操作系统是Windows 7(64位)。
我们如何测试内存使用情况?
使用自定义分配器,我们可以看到使用了多少内存,因为所有malloc调用都被延迟到分配器。对于malloc(),在Debug模式下,我们只需逐步执行代码并在任务管理器中观察内存使用情况即可。在发布模式下,我们也是这样做的,但不太精细,因为编译器会将许多内容进行优化,所以我们无法逐个代码段地执行(发布和调试模式之间的内存差异约为20MB,我认为这是由于优化和发布模式中缺乏调试信息造成的)。
malloc单独可能是导致如此巨大开销的原因吗?如果是这样,malloc内部到底发生了什么导致了这种开销?