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

如何使用C+测量块或程序中使用的内存+; 什么是衡量C++程序或C++程序中的块使用的内存的最好方法。因此,测量代码应为代码的一部分,不应从外部测量。我知道这项任务的难度,所以它不一定要100%准确,但至少能给我一个良好的内存使用印象。,c++,memory-management,measurement,C++,Memory Management,Measurement,类级重写new和delete操作符就是你想要的。重载new和delete可能是一种方法。不仅是在一个特定的类上,而且可能更一般。但是您还需要标记新建和删除的位置。然后进行某种启动/重置或标记,现在你进入这个区块,现在你退出区块。然后,您需要保留历史记录,以便能够在历史记录发生后对其进行监控。除非您愿意直接向测试代码显式添加插装,否则在块级别进行测量将很困难(最多) 我不会从类级别的new和delete重载开始尝试这样做。相反,我会使用重载::operator new和::operator del

类级重写
new
delete
操作符就是你想要的。

重载
new
delete
可能是一种方法。不仅是在一个特定的类上,而且可能更一般。但是您还需要标记
新建
删除
的位置。然后进行某种启动/重置或标记,现在你进入这个区块,现在你退出区块。然后,您需要保留历史记录,以便能够在历史记录发生后对其进行监控。

除非您愿意直接向测试代码显式添加插装,否则在块级别进行测量将很困难(最多)

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


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

正如其他人所指出的,您可以重载new和delete来测量分配了多少堆。要对堆栈执行同样的操作,如果您觉得有冒险精神,则必须执行一些ASM。在x86-64中的GCC中获取堆栈位置:

int64_t x = 0;
asm("movq %%rsp, %0;" : "=r" (x) );
这将把堆栈指针的地址放入x中。将其放在代码周围的几个地方,并比较输入块之前/之后的值


请注意,这可能需要一些工作才能得到您想要的,因为编译器可能会如何/何时分配内存;它不是直观的或琐碎的,它听起来像。

为什么要求测量代码应该是代码的一部分,而不是使用,例如,剖析器?因为代码中有算法,它应该被C++中的另一个用户调用,然后返回内存使用信息。目前,只测量运行时并在调用函数后使用。在最好的情况下,我想用智能构造器/解构器调用来测量C++块的内存使用(我现在正在使用RU时间度量),我也认为这是一条路。问题是,外部静态链接库会发生什么情况,我想这会降低性能。正确,如果没有跟踪外部库的机制,则无法跟踪外部库。而且会有一场演出热播。如果我们谈论的是单线程启动/停止的低使用率,可能不会太大。我同意你的观点,并考虑过给出这样的答案。我看到的唯一问题是,一些代码可能会调用
malloc
系列中的函数。