13

我正在寻找一种工具来简化分析大型 C++ 项目 (VC6) 的链接器映射文件。

在维护期间,二进制文件稳定增长,我想弄清楚它来自哪里。我怀疑在不同 DLL 之间共享的库中存在一些过度热心的模板扩展,但是浏览地图文件并没有提供很好的线索。

有什么建议么?

4

5 回答 5

16

是一个很棒的编译器生成的地图文件分析/浏览器/查看器工具。检查您是否可以浏览 gcc 生成的地图文件。

amap :分析 32 位 Visual Studio 编译器生成的 .MAP 文件并报告数据和代码使用的内存量的工具。此应用程序还可以读取和分析由 Xbox360、Wii 和 PS3 编译器生成的 MAP 文件。

于 2012-09-19T11:09:32.323 回答
2

地图文件应该有每个部分的大小,您可以编写一个快速工具来按此大小对符号进行排序。还有一个 MSVC (undname.exe) 附带的命令行工具,您可以使用它来解开符号。

将符号按大小排序后,您可以根据需要每周或每天生成此符号,并比较每个符号的大小随时间的变化情况。

任何单个构建中的地图文件可能不会说明太多,但编译地图文件的历史报告可以告诉您很多信息。

于 2009-02-23T18:42:40.427 回答
2

您是否尝试过在 .obj 文件上使用 dumpbin.exe?

要寻找的东西:

  • 使用大量的 STL?
  • 很多带有内联方法的 c++ 类?
  • 很多常数?

如果上述任何一项适用于您。检查它们是否具有广泛的可见性,即它们是否在您的应用程序的大部分中使用/看到。

于 2009-06-14T01:00:10.137 回答
1

没有对工具的建议,但猜测可能的原因:您是否启用了增量链接?这可能会导致后续构建期间的扩展...

如果您使用 /opt:ref 进行编译,链接器将删除未使用的符号,因此如果您使用它而不使用增量链接,我希望二进制文件的扩展只是添加实际新代码的结果。据我所知……希望对你有所帮助。

于 2009-02-23T18:33:03.677 回答
0

模板、宏、STL 通常都使用大量空间。BOOST 被誉为一个伟大的通用库,为项目增加了很多空间。BOOST_FOR_EACH 就是一个例子。它有数百行模板化代码,可以通过编写适当的循环句柄来避免,这通常只需要几个按键。

获取 Visual AssistX 以节省输入,而不是使用模板。还要考虑拥有您使用的代码。宏和内联函数扩展不一定会出现。

此外,如果可以的话,从 DLL 架构转向将所有内容静态链接到一个以不同“模式”运行的可执行文件中。使用相同的可执行映像多次使用绝对没有错,只需根据您希望它执行的操作传入不同的命令行参数即可。

DLL 是浪费空间和减慢项目运行时间的罪魁祸首。人们认为他们是节省空间的人,而实际上他们往往会产生相反的效果,有时会将项目规模扩大十倍!另外,它们增加了交换。使用固定代码段(无重定位段)来提高性能。

于 2010-12-16T13:19:25.573 回答