首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在原生C++项目中统计每个类的实例数量以及它们在峰值时间消耗的内存

如何在原生C++项目中统计每个类的实例数量以及它们在峰值时间消耗的内存
EN

Stack Overflow用户
提问于 2011-08-09 23:28:42
回答 3查看 111关注 0票数 1

我的编译器项目有严重的内存消耗。所以我想找到一种方法,可以找出哪个类是最差的。它应该会给我类似于bellow的东西:

代码语言:javascript
复制
--------------------------------------------------------------------
Class name, Instance count, Peak memory consumed

Circle, 223, 2230 k

Rectangle, 124, 3220 k

Line, 22322, 222322 k

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

我在网上搜索了很长一段时间,但到目前为止还没有结果。:(

我已经尝试过Devpartner工具。据我所知,它不能处理原生C++。是不是因为我不知道怎么用?

你有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-09 23:31:12

当然,我希望您谈论的是动态分配的内存。

您应该使用内存分析工具。

如果没有,您应该为您自己的类重载new anddelete`操作符,并在其中实现内存计数机制。

票数 0
EN

Stack Overflow用户

发布于 2011-08-10 00:00:58

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

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

编辑:

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

示例输出:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2011-08-10 07:26:50

您可以尝试在类的构造函数中自动递增(在win32中为InterlockedIncrement)在类的构造函数中声明的静态int,并在类的析构函数中自动递减它。然后,您可以使用另一个静态方法来检索计数和总内存消耗。

假设您有少量的可疑类,这应该不会花费超过合理数量的编码工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6998720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档