我正在研究一个C++程序,来自一个1200行文件(初始化一个相当复杂的状态机)的编译对象代码几乎达到了一兆字节.什么可以使文件这么大?有没有办法找到目标文件中需要空间的内容?
当目标文件大于它们必须至少时,可能有几个原因:
静态地包括依赖库
使用调试信息构建
建立分析信息
使用模板创建(极其)复杂的数据结构(可能是递归的boost-structures)
编译时没有打开优化标志(保存不那么多,如果使用得太厉害会造成困难)
起初我建议检查你是否正在使用调试信息进行构建,这会导致我的体验中最臃肿.
(我假设你已经进行了优化并且打开了死代码剥离).
打开链接器的"生成映射文件"选项并检查输出.
常见的罪魁祸首是产生大量代码和大型全局对象的宏/模板.
可能是一些模板实例化(尤其是std::iostream
s),也可能是大量的内联(即在头文件中完全定义的类).但是,首先是1兆字节的目标文件有什么问题?在链接期间,它可能会产生一个很小的二进制文件.我在这里得到了一个项目,其中包含20 MiB的目标文件,例如链接到700 KiB二进制文件.
更新:也可能是一些大的静态数组/对象.除此之外,使用MSVC++和GCC,您可以查看生成的文件的程序集,它可以为您提供一些提示(使用GCC g++ -S foo.cpp
,对于MSVC++,它是'/ FAs').要么你会看到很多模板实例,那么这就是原因.如果不是,那就是对象的对象大小static
.