我已阅读(http://www.nobugs.org/developer/win32/debug_crt_heap.html),除了请求的内存块之外,HeapAlloc还为记账分配了一些内存。簿记信息的大小应为40个字节(块之前为8个字节,之后为32个字节)。
但是,当我使用我的VS2010进行测试时,实际消耗的内存明显减少了。 例如,我将1M ints插入到集合中。我为malloc编写了一个钩子函数,以确保每个插入都触发一个单独的动态内存分配请求来构造一个新节点。根据hook,一个节点需要20个字节。如果我们添加80字节开销,则一个节点的总内存应为100字节。这就是集合应该消耗~100兆,而根据TaskManager,它只需要32兆。
因此,我有以下问题:
开销真的是40个字节吗? 开销是否适用于每个HeapAlloc的块?
答案 0 :(得分:0)
这似乎是一个混乱的问题。我不确定任务管理器是否显示物理或虚拟内存。
如果您的分配要转换文件,它们可能不会反映在任务管理器中。您应该尝试更高级的性能监控工具。
答案 1 :(得分:0)
我很确定malloc
没有为每个分配调用HeapAlloc,我希望如此。当然在glibc的情况下,操作系统仅被调用以提供更大的内存块,并且被分割 - 具有比OS分配开销更小的开销。
您可以通过为一小块内存(例如20个字节)调用malloc
与调用HeapAlloc
一百万次来测试。需要更长的时间?如果HeapAlloc更快,那么每HeapAlloc
调用malloc
似乎是合理的 - 但我希望malloc
显着更快。