HeapAlloc簿记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HeapAlloc簿记相关的知识,希望对你有一定的参考价值。

我读过(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的块?

答案

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

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

另一答案

我很相信malloc不会为每次分配调用HeapAlloc,我希望如此。当然在glibc的情况下,操作系统仅被调用以提供更大的内存块,并且被分割 - 具有比OS分配开销更小的开销。

您可以通过调用malloc与调用HeapAlloc一百万次来获取一小块内存(例如20个字节)来测试。需要更长的时间?如果HeapAlloc更快,那么HeapAlloc被称为每个malloc都是合理的 - 但我希望malloc明显更快。

以上是关于HeapAlloc簿记的主要内容,如果未能解决你的问题,请参考以下文章

malloc 和 HeapAlloc 之间是不是存在根本区别(除了可移植性)? [复制]

Windows API一日一练 78 HeapAlloc函数

C++ / Windows:HeapAlloc() 用于无争用的每线程堆

sql PostgreSQL的基本复式簿记系统。

Visual Studio 2010 C++:malloc()/HeapAlloc 总是为最小的分配大小分配新页面

如果我在簿记员处理Quickbooks时查询数据(以编程方式)会发生什么?