0

传统上,我使用 CRT 内存报告功能,如下所示:

    _CrtMemState state[3];
    _CrtMemCheckpoint(&state[0]);
    foo();
    _CrtMemCheckpoint(&state[1]);
    int const diff = _CrtMemDifference(&state[2], &state[0], &state[1]);
    _CrtMemDumpStatistics(&state[2]);

最近,我使用了 Visual Studio 的内置堆分析工具和快照。在 foo() 之前创建第一个快照,在 foo() 之后创建第二个快照,然后查看 diff 输出。

现在我同时使用了两者并比较了结果。我预计这两个结果几乎相同,如果不完全相同的话。但这种情况并非如此。内存大小差异很大。他们唯一共享的是分配的数量。我不知道该怎么做。我应该如何解释这些结果?造成差异的原因是什么?我应该相信谁?

请注意,无论是否启用堆分析,CRT 结果都是相同的。

4

1 回答 1

0

因此,内存分析似乎既不是一门精确的科学,也不是一门非常流行的科学。

对我自己的问题的简短回答:只需选择任何类型的测量,然后坚持使用它并比较您进行的每个测量的抽象数字。但永远不要开始怀疑这些数字可能意味着什么。

仅供参考,这是我探索的内容:

  • 通过 _CrtMemCheckpoint / _CrtMemDifference 进行快照差异。
  • 此外 _CrtSetAllocHook 用于跟踪任务期间的总分配,因为 _CrtMemState 的 lHighWaterCount(自应用程序启动以来的峰值,而不是自上次快照以来的峰值)和 lTotalCount(溢出,有时是奇怪的故障)不可靠。遗憾的是,_CrtSetAllocHook 不能让您匹配分配和解除分配。
  • GetProcessHeap / HeapSummary 检查默认进程堆。
  • GetProcessMemoryInfo 产生与 HeapSummary 相似的数字,但当然不一样。有时,两者之间甚至有很大的差距。显然 GetProcessMemoryInfo 还提供了您在 Windows 的 TaskManager 中看到的值。

最后,我在调试时使用了_CrtMemCheckpoint、_CrtMemDifference 和_CrtSetAllocHook,因为我觉得我可以解释这些数字。但是,这些功能在发布时不可用,所以我在那里使用了 GetProcessMemoryInfo。不知道如何解释这些数字,但每次它们因为我的优化而下降时,它们都会给我一张快乐的脸。

于 2020-02-18T14:28:33.740 回答