这里有一个粗心写的模板,有些过分内联 - 在C++中编写膨胀代码太容易了.原则上,重构以减少膨胀不是太难.问题在于跟踪最严重的违规模板和内联 - 跟踪那些在真实程序中导致真正膨胀的项目.
考虑到这一点,并且因为我确信我的库比他们应该更容易臃肿,我想知道是否有任何工具可以自动追踪那些最严重的违规者 - 即识别那些贡献最多的项目(包括所有重复的实例化和调用)到特定目标的大小.
此时我对性能不太感兴趣 - 这完全取决于可执行文件的大小.
有没有这个工作的工具,可以在Windows上使用,并适合MinGW GCC或Visual Studio?
编辑 - 一些背景
我有一组多路树模板,可以替代红黑树标准容器.它们是围绕非类型安全的非模板代码编写的,但它们也是很久以前编写的,并且作为"将更好地缓存友好性提升实际性能"实验.关键是,它们并非真正用于长期使用.
因为它们支持一些方便的技巧(基于自定义比较/部分键搜索,有效的下载访问,搜索最小的未使用的键),它们最终在我的代码中的任何地方都被使用.这些天,我几乎没有使用std :: map.
除了那些之外,我还有一些更复杂的容器,比如双向地图.最重要的是,我有树和有向图类.除此之外......
使用地图文件,我可以追踪非内联模板方法是否导致膨胀.这只是找到特定方法的所有实例并添加大小的问题.但是不明智的内联方法呢?毕竟,模板是非模板代码的薄包装,但历史上我判断是否应该内联的能力并不是非常可靠.这些模板内联的膨胀影响并不容易衡量.
我知道哪些方法被大量使用,但这是众所周知的opimization-without-profiling错误.
我前段时间遇到过这样的问题,最后我编写了一个分析地图文件的自定义工具(可以指示Visual Studio链接器生成一个).工具输出是:
解析映射文件相对容易(函数代码大小可以计算为当前行和后续行之间的差异),最难的部分可能是以合理的方式处理损坏的名称.您可能会发现一些可以使用的库,这是我几年前做的,我不知道目前的情况.
以下是地图文件的摘录,以便您知道会发生什么:
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文件.