我读过(http://www.nobugs.org/developer/win32/debug_crt_heap.html),HeapAlloc除了请求的内存块之外,还分配了一些内存用于记账。记账信息的大小为40字节(分块前8字节,分块后32字节)。
然而,当我用我的VS2010运行一个测试时,实际消耗的内存要少得多。例如,我将1M个整数插入到一个集合中。我为malloc编写了一个钩子函数,以确保每次插入都会触发一个单独的动态内存分配请求来构造一个新节点。根据钩子,一个节点需要20个字节。如果我们增加80字节的开销,那么一个节点的总内存应该是100字节。也就是说,set应该消耗大约100兆,而根据TaskManager的说法,它只需要32兆。
因此,我有以下问题:
开销真的是40字节吗?开销是否适用于每个HeapAlloc块?
发布于 2013-02-01 18:37:39
这似乎是一个混乱的问题。我不确定任务管理器显示的是物理内存还是虚拟内存。
如果您的分配要交换文件,它们可能不会反映在任务管理器中。您应该尝试更高级的性能监视工具。
发布于 2013-02-01 18:44:26
我非常确定malloc不会在每次分配时都调用HeapAlloc。当然,在glibc的情况下,调用OS只是为了提供更大的内存块,这是拆分的--开销比OS分配开销小。
你可以通过对一小块内存(例如20字节)调用malloc和调用HeapAlloc一百万次的时间来测试这一点。哪个需要更长的时间?如果HeapAlloc更快,那么每个malloc都调用HeapAlloc是合理的-但我希望malloc更快。
https://stackoverflow.com/questions/14644284
复制相似问题