gpt4 book ai didi

c++ - 原生C++项目中,如何统计每个类的实例数和高峰时间消耗的内存

转载 作者:行者123 更新时间:2023-11-30 04:33:16 24 4
gpt4 key购买 nike

我的编译项目内存消耗严重。所以我想找到一种方法,可以找出哪个类(class)最差。它应该给我类似下面的东西:

--------------------------------------------------------------------
Class name, Instance count, Peak memory consumed

Circle, 223, 2230 k

Rectangle, 124, 3220 k

Line, 22322, 222322 k

....., ..., .... .

我在网上搜索了很长时间,但至今没有结果。 :(

我尝试过 Devpartner 工具。据我所知,它无法处理 native C++。那是因为我不知道如何使用它吗?

你有什么建议吗?

最佳答案

您可以使用内存泄漏检测器或垃圾收集器。我个人将 Boehm GC 用作垃圾收集器,但也可以将其用作泄漏检测器。我的 friend 使用 valgrind 进行内存泄漏检测。

也可以从自定义对象派生所有类,它在静态 std::set 结构中跟踪所有分配的对象;构造函数将“this”插入此结构,析构函数将其删除。然后,您可以在程序末尾使用静态 Object::detectMemoryLeaks() 来打印出所有泄漏对象及其 typeid(ptr).name()。

编辑:

我在过去几个小时内将我的版本实现到我的库中。还没有找到排除静态变量或自动确定多态对象大小的方法。另外,请原谅类似 java 的外星人代码和垃圾收集的存在:headerimplementation .查找构造函数、析构函数、aliveObjects 静态属性和 listAliveObjects 静态方法。您可以轻松了解概念的要点。

示例输出:

Frigo::Lang::Array<char> : 6 objects
Frigo::Lang::String : 6 objects
Frigo::Lang::Boolean : 2 objects
Frigo::Lang::Integer : 2 objects
Frigo::Math::Infinity : 1 objects
Frigo::Lang::Class : 1 objects

----

Frigo::Lang::Array<char> : 7 objects @ 0x1d33e18, 0x1d33e78, 0x1d33ed8, 0x1d33f38, 0x1d33f68, 0x1d33f98, 0x1d33fc8
Frigo::Lang::String : 7 objects @ 0x1d33e10, 0x1d33e70, 0x1d33ed0, 0x1d33f30, 0x1d33f60, 0x1d33f90, 0x1d33fc0
Frigo::Lang::Boolean : 2 objects @ 0x1d30fa8, 0x1d30fd8
Frigo::Lang::Integer : 2 objects @ 0x1d30e88, 0x1d30eb8
Frigo::Lang::Class : 1 objects @ 0x1d30f60
Frigo::Math::Infinity : 1 objects @ 0x41a110

----

Frigo::Lang::Array<char> : 6 objects
Frigo::Lang::Array<char>@3b3e78
Frigo::Lang::Array<char>@3b3ed8
Frigo::Lang::Array<char>@3b3f38
Frigo::Lang::Array<char>@3b3f68
Frigo::Lang::Array<char>@3b3f98
Frigo::Lang::Array<char>@3b3fc8
Frigo::Lang::String : 6 objects
Frigo::Lang::Boolean
Frigo::Lang::Class
Frigo::Lang::Integer
Hello World!
true
false
Frigo::Lang::Boolean : 2 objects
true
false
Frigo::Lang::Integer : 2 objects
987
123
Frigo::Math::Infinity : 1 objects
Frigo::Math::Infinity@41a110
Frigo::Lang::Class : 1 objects
Frigo::Lang::Class@3b0f60

----

Frigo::Lang::Array<char> : 7 objects
@ 0x1cd3e18 : Frigo::Lang::Array<char>@1cd3e18
@ 0x1cd3e78 : Frigo::Lang::Array<char>@1cd3e78
@ 0x1cd3ed8 : Frigo::Lang::Array<char>@1cd3ed8
@ 0x1cd3f38 : Frigo::Lang::Array<char>@1cd3f38
@ 0x1cd3f68 : Frigo::Lang::Array<char>@1cd3f68
@ 0x1cd3f98 : Frigo::Lang::Array<char>@1cd3f98
@ 0x1cd3fc8 : Frigo::Lang::Array<char>@1cd3fc8
Frigo::Lang::String : 7 objects
@ 0x1cd3e10 : Frigo::Lang::Boolean
@ 0x1cd3e70 : Frigo::Lang::Class
@ 0x1cd3ed0 : Frigo::Lang::Integer
@ 0x1cd3f30 : Frigo::Math::Infinity
@ 0x1cd3f60 : Hello World!
@ 0x1cd3f90 : true
@ 0x1cd3fc0 : false
Frigo::Lang::Boolean : 2 objects
@ 0x1cd0fa8 : true
@ 0x1cd0fd8 : false
Frigo::Lang::Integer : 2 objects
@ 0x1cd0e88 : 987
@ 0x1cd0eb8 : 123
Frigo::Lang::Class : 1 objects
@ 0x1cd0f60 : Frigo::Lang::Class@1cd0f60
Frigo::Math::Infinity : 1 objects
@ 0x41b110 : Frigo::Math::Infinity@41b110

关于c++ - 原生C++项目中,如何统计每个类的实例数和高峰时间消耗的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6998720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com