如何统计本地c++项目中每个类的实例数以及它们在高峰期消耗的内存?
How can I statistic instance numbers of each class and the memory they consumed in the peak time in native C++ project
我的编译器项目有严重的内存消耗。我想找一个方法来找出哪个类是最差的。它应该显示如下内容:
--------------------------------------------------------------------
Class name, Instance count, Peak memory consumed
Circle, 223, 2230 k
Rectangle, 124, 3220 k
Line, 22322, 222322 k
....., ..., .... .
我在网上搜索了很长时间,但到目前为止还没有结果。(
我试过Devpartner工具。据我所知,它不能处理本地c++。是因为我不知道怎么用吗?
你有什么建议吗?您可以使用内存泄漏检测器或垃圾收集器。我个人使用Boehm GC作为垃圾收集器,但也可以将其用作泄漏检测器。我的朋友使用valgrind进行内存泄漏检测。
也可以从一个自定义对象中派生出所有的类,该对象在静态std::set结构中跟踪所有已分配的对象;构造函数将"this"插入到该结构中,析构函数将其移除。然后,您可以在程序末尾使用静态Object::detectMemoryLeaks()来打印出所有泄漏对象及其类型id(ptr).name()。
编辑:在过去的几个小时里,我在我的库中实现了我的版本。尚未找到排除静态变量或自动确定多态对象大小的方法。此外,请原谅类似java的怪异代码以及垃圾收集头和实现的存在。查找构造函数、析构函数、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
当然我希望你说的是动态分配内存。
你应该使用内存分析工具。如果没有,你应该为你自己的类重载new and
delete操作符,并在相同的情况下实现内存计数机制。
您可以尝试在类的构造函数中自动递增(win32中的InterlockedIncrement)在类中声明的静态int,并在类的析构函数中自动递减。然后,您可以使用另一个静态方法来检索计数和消耗的总内存。
假设您有少量的可疑类,这应该不会超过合理的编码工作量。
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 常量类实例的C++内存地址
- 是否应该使用继承来减少内存消耗的实例的内存分配?
- 在C++中,为什么仅包含与其基类实例的联合的派生类占用的内存多于联合的大小?
- 在函数中实例化的 STL 对象正在占用堆栈或堆上的内存?
- 将内存文件添加到 clang 编译器实例
- 在结构中使用位字段并使用C++从内存中读取实例
- 如何将内存分配给具有数组成员的类的实例
- std::array 模板实例会占用更多的代码内存吗?
- 插入std :: basic_ostream实例化输出时的内存故障
- 构造函数C++中的类实例内存地址
- 基本指针如何能够在派生的类实例中了解基本成员的内存位置
- 有没有办法区分对象实例使用的内存类型
- 如果我声明一个没有名称的类实例,它会保留在内存中吗?
- 当我创建一个int指针并实例化一个数组时,数组在内存中发生了什么
- 派生类的实例化是否为基类的私有成员分配内存
- 分配给 cpp 中定义的全局静态变量的内存是否在 C++ 中删除其类的实例后释放
- 从用户控制的内存池中分配和实例化对象
- C++中参数列表中实例化对象的内存管理
- 重载运算符 std::ostream& 运算符<<打印实例内存地址