我目前正在研究我编写的C ++应用程序(使用OpenGL的渲染引擎)的内存消耗问题,并且偶然发现了一个相当不寻常的问题:
我基本上在系统的每个地方使用我自己的分配器,它们都从默认分配器获取内存,该分配器使用malloc()
/ free()
作为实际内存。
事实证明,我的应用程序总是通过malloc()为每个分配保留至少4096个字节(我的系统上的页面大小),即使大小要小得多。
malloc(8)
或甚至malloc(1)
都会导致内存增加4096字节。我在分配之前和之后直接通过GetProcessMemoryInfo()跟踪使用的内存大小,以及通过TaskManager(基本上显示相同的值)。有趣的是,使用_msize(ptr)
返回正确的指针大小。
我只能在自己的应用程序中重现这种行为,使用新的VS2012 C ++项目测试它并没有产生相同的结果。此行为似乎也与应用程序的当前保留大小无关,即使有超过10GB的可用RAM,它仍然每个分配至少保留4K。
我对Windows操作系统的内部结构没有深入的了解(如果它与操作系统完全相关),那么如果有人知道可能导致这种行为的原因,我会很高兴!
答案 0 :(得分:2)
检查一下,这是从1993年开始的: - )
http://msdn.microsoft.com/en-us/library/ms810603.aspx
这并不意味着可以在堆中分配的最小内存量是4096字节;相反,堆管理器根据需要提交内存页面以满足特定的分配请求。例如,如果应用程序通过调用GlobalAlloc分配100个字节,则堆管理器在其提交的区域内为此请求分配一个100字节的内存块。如果在请求时没有足够的已提交内存,则堆管理器只需提交另一个页面以使内存可用。
答案 1 :(得分:0)
您可能正在运行“整页堆”...一种诊断模式,可以帮助您更快地捕获代码中的内存访问错误。