2009-01-22 104 views
3

我正在使用C++程序,并且从单个1200行文件(初始化一个相当复杂的状态机)编译的目标代码出来的速度接近1兆字节。什么可能使文件如此之大?有没有一种方法可以找到什么需要在目标文件中的空间?我的C++目标文件太大

回答

8

可能有多种原因,当目标文件大于他们必须有最少:

  • 静态包括依赖库的调试信息
  • 建筑
  • 建筑与分析信息
  • 创建(极其复杂的数据结构)使用模板(可能是递归提升结构)
  • 编译时未启用优化标志(不保存太多,如果使用得太过分会造成困难)

起初我建议检查一下,如果你是用调试信息构建的,这会导致我的体验最膨胀。

7

(我假设你有优化和死代码剥离打开)。

打开链接器的“生成映射文件”选项并检查输出。

常见的罪魁祸首是产生大量代码的宏/模板和大型全局对象。

+1

他正在谈论一个未链接的对象文件。 – 2009-01-22 19:34:52

+0

@Rob K,对象文件被链接成最终的二进制文件。二进制文件具有地图。因此,该二进制包含来自目标文件的部分。您可以在有问题的源文件中查找函数和对象,并查看它们的大小。 – strager 2009-01-22 21:02:08

5

可能有一些模板实例化(特别是std::iostream),也可能是内联(即在头中完全定义的类)。但是,1兆字节的目标文件首先出现什么问题?在链接期间,它可能会导致一个很小的二进制文件。例如,我在这里获得了一个项目,其中包含20个MiB的目标文件,它们被链接到一个700 KiB二进制文件中。

更新:也可能是一些大的静态数组/对象。除此之外,使用MSVC++和GCC,您可以查看生成的程序集文件,它可以给你一些提示(使用GCC,对于MSVC++,它为g++ -S foo.cpp,它为'/FAs')。要么你会看到模板实例很多,那么这些都是原因。如果不是,则为static对象的对象大小。

-3

这里有一个宏我用它来看看编译时间值:

template <size_t N> struct compile_time_number { private: typedef int check; }; 
#define compiler_check_number(N) ((compile_time_number<N>::check)0) 

然后去幸福在编译的时候,看看有什么符号占用空间。

编辑:由于没有人似乎明白这一点,我会澄清:使用这种方式是添加compiler_check_number(sizeof(<insert struct or global variable here>))。编译器会将变量或结构的大小作为编译时错误吐出。很少有代码是一个巨大的目标文件的原因。

我总是用这个来看看有多大的东西,而不必运行一个调试器。

0

另一个可能的原因是链接时代码生成,一个VC++选项。这将编译器的后端移动到链接器中。这允许更好的优化,但是目标文件现在必须包含通常在前端和后端之间传递的所有内部数据结构。