有没有用于在C++中追踪膨胀的工具?

Ste*_*314 7 c++ profiler

这里有一个粗心写的模板,有些过分内联 - 在C++中编写膨胀代码太容易了.原则上,重构以减少膨胀不是太难.问题在于跟踪最严重的违规模板和内联 - 跟踪那些在真实程序中导致真正膨胀的项目.

考虑到这一点,并且因为我确信我的库比他们应该更容易臃肿,我想知道是否有任何工具可以自动追踪那些最严重的违规者 - 即识别那些贡献最多的项目(包括所有重复的实例化和调用)到特定目标的大小.

此时我对性能不太感兴趣 - 这完全取决于可执行文件的大小.

有没有这个工作的工具,可以在Windows上使用,并适合MinGW GCC或Visual Studio?

编辑 - 一些背景

我有一组多路树模板,可以替代红黑树标准容器.它们是围绕非类型安全的非模板代码编写的,但它们也是很久以前编写的,并且作为"将更好地缓存友好性提升实际性能"实验.关键是,它们并非真正用于长期使用.

因为它们支持一些方便的技巧(基于自定义比较/部分键搜索,有效的下载访问,搜索最小的未使用的键),它们最终在我的代码中的任何地方都被使用.这些天,我几乎没有使用std :: map.

除了那些之外,我还有一些更复杂的容器,比如双向地图.最重要的是,我有树和有向图类.除此之外......

使用地图文件,我可以追踪非内联模板方法是否导致膨胀.这只是找到特定方法的所有实例并添加大小的问题.但是不明智的内联方法呢?毕竟,模板是非模板代码的薄包装,但历史上我判断是否应该内联的能力并不是非常可靠.这些模板内联的膨胀影响并不容易衡量.

我知道哪些方法被大量使用,但这是众所周知的opimization-without-profiling错误.

Ben*_*aub 7

查看符号排序.我用了一段时间来弄清楚为什么我们的安装程序在六个月内增长了4倍(事实证明答案是C运行时和libxml2的静态链接).


Sum*_*uma 5

地图文件分析

我前段时间遇到过这样的问题,最后我编写了一个分析地图文件的自定义工具(可以指示Visual Studio链接器生成一个).工具输出是:

  • 按代码大小降序排序的函数列表,仅列出前N个
  • 按代码大小降序排序的源文件列表,仅列出前N个

解析映射文件相对容易(函数代码大小可以计算为当前行和后续行之间的差异),最难的部分可能是以合理的方式处理损坏的名称.您可能会发现一些可以使用的库,这是我几年前做的,我不知道目前的情况.

以下是地图文件的摘录,以便您知道会发生什么:

Address         Publics by Value              Rva+Base       Lib:Object

0001:0023cbb4       ?ApplyScheme@Input@@QAEXPBVParamEntry@@@Z 0063dbb4 f   mainInput.obj
0001:0023cea1       ?InitKeys@Input@@QAEXXZ    0063dea1 f   mainInput.obj
0001:0023cf47       ?LoadKeys@Input@@QAEXABVParamEntry@@@Z 0063df47 f   mainInput.obj

符号排序

正如Ben Staub的回答所发表的那样,Symbol Sort是一个随时可用的命令行实用程序(附带一个完整的C#源代码),可以完成所有这些工作,唯一的区别是不分析地图文件,而是pdb/exe文件.

  • 至于demangling,基于脚本的"undname.exe"和程序化解决方案的"UndecorateSymbolName()" - 更令人讨厌的部分是滤除噪声. (2认同)