确定包含的头文件对总文件大小的贡献
-
19-09-2019 - |
题
我有兴趣减少我的应用程序的文件大小。它是在 Visual Studio 2008 中使用 MVC++ 构建的 MFC/C++ 应用程序。UPX 在将最终 exe 大小减少到原始大小的 40% 左右方面做得很好,但我想减少更多。
MFC 必须静态链接到该项目中。
我尝试过这个问题中概述的一些方法: 减少 Windows 可执行文件大小. 。特别是对编译器/链接器应用不同的设置。
我相信我可以通过查看项目中包含某些标头的“成本”来进一步减小大小。
有关如何解决此问题的任何提示,也许是一个可以为我分析代码的工具?谢谢
解决方案
您很可能是错误的这一点。删除页眉可能导致稍有缩短建造周期,但所包含的内容主要是声明(你将需要在某些时候是这样)他们应该有很少或最终可执行文件的大小没有任何影响。
其他提示
,以减少该项目的大小的唯一方法是减少的代码量。正如尼尔指出,除去头只会缩短建造时间。编译器将不包括一切做一个“使用命名空间”的条款时,他们只会选择这是必要的。现在,在另一方面,如果您要添加页眉对事不对任何地方使用的全部是应该被删除一类的一个很好的迹象项目中。
您假设显然的是,可执行文件的大小在某种程度上有助于成分的总和,和在特定的源文件。它只是不这样的。
例如,假定为std::list<T>::size
的代码。它可以在许多翻译单元使用。然而,连接器将折叠多份在一起,有时甚至为不同类型的T。但你会如何解释在exectuable所得的字节?
现在,如果你甚至不能确定如何解释简单的字节(一组)的功能,那么你会怎么解释,甚至更复杂的结构?如果你不能分配在可执行用于字节indivual源文件,则不能确定个体贡献。
标头通常仅包含:
- 宏
- 类型定义(如类)
- 函数前向声明(函数定义在.c/.cpp文件中)
除非 .c /.cpp 文件中的代码实际使用了上述内容,否则实际上不会生成机器代码。
现在以上所有内容都需要解析(这会增加编译时间),但除非实际使用,否则将被忽略。
大多数现有的答案都假定头仅包含声明,这对可执行文件的大小没有影响。当然,如果该假设成立是真的,但它越来越相当普遍的标题包含实际的代码,以及(函数定义,通常情况下),而那些确实有助于代码的大小。
在另一方面,如果它们的那些功能实际上链接到最后的可执行仅贡献。他们如果您呼叫这些功能仅链接到最终的可执行文件。因此,即使头可能导致越来越多的可执行文件的大小,你打算怎么办呢?你不能删除您的的代码中使用的。删除头文件只是不是一个选项,然后 - 除非您移动代码别的地方,然后它会增加可执行文件大小的反正的
所以,无论是头部没有什么区别,或者它确实有差别,因为您使用的是在它的代码,然后它不能被删除。在这两种情况下,去除头是不会给你买了。