2

我读过(http://www.nobugs.org/developer/win32/debug_crt_heap.html),除了请求的内存块之外,HeapAlloc 还为簿记分配了一些内存。bookkeeping info 的大小应为 40 字节(块前 8 字节,块后 32 字节)。

但是,当我用我的 VS2010 运行测试时,实际消耗的内存会明显减少。例如,我将 1M 个整数插入到一个集合中。我为 malloc 编写了一个钩子函数,以确保每次插入都会触发一个单独的动态内存分配请求来构造一个新节点。根据 hook,一个节点占用 20 个字节。如果我们增加 80 字节的开销,一个节点的总内存应该是 100 字节。也就是说,这套设备应该消耗大约 100 兆,而根据 TaskManager,它只需要 32 兆。

因此,我有以下问题:

开销真的是 40 字节吗?开销是否适用于每个 HeapAlloc 的块?

4

2 回答 2

0

这似乎是一个混乱的问题。我不确定任务管理器是显示物理内存还是虚拟内存。

如果您的分配要交换文件,它们可能不会反映在任务管理器中。您应该尝试更高级的性能监控工具。

于 2013-02-01T10:37:38.823 回答
0

我相当肯定malloc不会为每个分配调用 HeapAlloc,我希望如此。当然,在 glibc 的情况下,仅调用 OS 以提供更大的内存块,并且将其拆分 - 开销小于 OS 分配开销。

您可以通过为一小块内存(例如 20 字节)花时间调用malloc与调用一百万次来测试这一点。HeapAlloc哪个需要更长的时间?如果 HeapAlloc 更快,那么HeapAlloc每次都调用它是合理的malloc- 但我希望这malloc会快得多。

于 2013-02-01T10:44:26.070 回答