C / C ++应用程序中用于分析过多代码大小的一些技术或工具是什么?

我有一个C ++库,生成更大的代码,我真的会期望它正在做什么。 从不到5万行的源代码中,我得到的共享对象几乎是4 MB,而静态存档则是9。这是有问题的,这是因为库的二进制文件非常大,而且更糟糕的是,连接它的简单应用程序通常会增加500到1000 KB代码大小。 用像-Os这样的标志来编译这个库有点帮助,但并不是非常有帮助。

我也尝试过使用GCC的-frepo命令(即使我看过的所有文档都暗示在Linux上collect2会合并重复的模板),模板上的显式模板实例化似乎很可能被重复,但是没有在任何情况下都有实效。 当然我会说“很有可能”,因为就像任何forms的分析一样,这样的猜测几乎总是错的。

有没有一些工具可以很容易地分析代码的大小,或者我可以找出哪些东西占用了太多的空间,或者更一般地说,我应该尝试其他任何东西? 在Linux下工作的东西将是理想的,但我会尽我所能。

Solutions Collecting From Web of "C / C ++应用程序中用于分析过多代码大小的一些技术或工具是什么?"

如果你想知道你的可执行文件是什么,请问你的工具。 打开ld链接器的–print-map(或-M)选项来生成一个映射文件,显示它在内存中的位置以及位置。 这样做的静态链接的例子可能更多的信息。

如果你不是直接调用ld,而只是通过gcc命令行,那么你可以通过在-gl前面加上ld特定的选项来从gcc命令行传递ld。

在Linux上,链接器当然会合并多个模板实例。

确保你没有测量调试二进制文件(调试信息可能占用最终二进制大小的75%以上)。

减少最终二进制大小的一种技术是用-ffunction-sections-fdata-sections进行编译,然后用-ffunction-sections-fdata-sections链接。

如果使用[gold][1] (新的仅ELF链接器,binutils的一部分)的开发版本,甚至更大的减少(我们已经看到25%),并且与-Wl,--icf

另一个有用的技术是减少由共享库“导出”的一组符号(所有内容都默认导出),可以通过__attribute__((visibility(...)))或使用链接描述文件来实现。 详情在这里 (见“出口管制”)。

一种非常简单但很快的方法是查看目标文件的大小。 并不是所有的对象文件中的代码都会被编译成最终的二进制文件,所以可能会有一些误报,但是它可以给出热点位置的好印象。 一旦找到最大的目标文件,就可以使用objdumpnm等工具深入研究它们。