2

测量 C++ 程序或 C++ 程序中的块使用的内存的最佳方法是什么。因此,测量代码应该是代码的一部分,不应从外部测量。我知道这项任务的难度,所以它不一定要 100% 准确,但至少给我一个内存使用情况的好印象。

4

4 回答 4

2

重载newdelete可能是要走的路。不仅在特定课程上,而且可能更普遍。但是您还需要标记newanddelete的制作位置。现在你进入这个块,并且现在你退出这个块,并且有某种开始/重置或标记的东西。然后您需要保留历史记录,以便在它发生后对其进行监控。

于 2010-02-07T09:50:16.510 回答
2

除非您愿意直接向被测代码显式添加检测,否则在块级别进行测量将是困难的(充其量)。

我不会从类级别的重载开始new尝试delete这样做。相反,我会使用::operator newand的重载::operator delete。这基本上是漏斗的一角(可以这么说)——所有其他动态内存管理最终都归结为调用它们(而且大多数都是直接调用的)。因此,他们通常会尽力告诉您整个程序的动态内存使用情况。

您需要处理单个类的重载的主要时间是它们是否new已经重载,因此他们正在管理一个单独的池,并且您关心在给定时间该池有多少正在使用. 在这种情况下,您(几乎)需要直接向它们添加检测,以获得在给定时间间隔内它们的内存使用量的高水位标记。delete

于 2010-02-07T16:45:04.113 回答
1

new和运算符的类级别覆盖delete是您想要的。

于 2010-02-07T08:25:15.100 回答
1

正如其他人指出的那样,您可以重载 new 和 delete 来衡量分配了多少堆。为堆栈做同样的事情,如果你喜欢冒险,你将不得不做一些 ASM。在 x86-64 中的 GCC 中获取堆栈位置:

int64_t x = 0;
asm("movq %%rsp, %0;" : "=r" (x) );

这将在 x 中放入堆栈指针的地址。将它放在代码周围的几个地方,并比较输入块之前/之后的值。

请注意,由于编译器如何/何时分配内存,这可能需要一些工作才能获得您想要的东西;它不像听起来那么直观或微不足道。

于 2010-02-07T17:44:51.307 回答