我的工作C++程序和编目代码从一个单一的1200线文件(其初始化的一个相当复杂的国家机)来几乎一兆字节。有什么能做出的文件那么大?有没有办法我可以找到什么需要内部的空间物体的文件?

有帮助吗?

解决方案

可能有几个原因,当目的文件比他们必须在最低限度:

  • 静态的,包括依赖库
  • 建设与"调试"的信息
  • 建设与分析信息
  • 创造(非常)复杂的数据结构使用的模板(也许递升的结构)
  • 不是把优化标志,同时汇编(保存没那么多,可以引起困难,如果使用太极)

第一,我建议如果要检查你楼"调试"的信息,这导致最膨胀在我的经验。

其他提示

(我假设你已经得到的优化和无用代码剥离打开)。

打开你的连接器的“生成地图文件”选项,并检查输出。

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

可能地(其在报头中完全定义即类)一些模板实例(尤其是std::iostreams),也许广泛内联。但是,什么是与摆在首位的1兆字节的对象文件的问题?链接期间,它很可能会导致在一个很小的二进制文件。我有一个项目在这里与目标文件的20个MIB它被连接成一个700昆明植物研究所二进制例如。

更新:可能是也有一些大的静态阵列/对象。除此之外,随着MSVC ++和GCC,你可以看看一个文件生成的程序集,它可以给你一些提示(与海湾合作委员会,这是g++ -S foo.cpp,对于MSVC ++,它的 '/ FAS' )。要么你会看到的的模板实例很多的,那么这些都是原因。如果不是,它是static对象的对象的大小。

另一个可能的原因是链接时代码生成,一个VC选项。这使编译器的后端插入连接器。这允许更好的优化,但对象文件现在必须包含所有内部数据结构通常前端和后端之间通过。

下面是我用来看到编译时间值的宏:

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>))的方式。编译器将吐出变量或结构作为一个编译时间错误的大小。很少是代码一个巨大的对象文件的原因。

我用这一切的时候,看东西有多大,而无需运行调试器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top