确定包含的头文件对总文件大小的贡献

时间:2009-12-16 14:09:50

标签: c++ model-view-controller mfc header-files filesize

我有兴趣减少应用程序的文件大小。它是一个在Visual Studio 2008中使用MVC ++构建的MFC / C ++应用程序.UPX可以很好地将最终的exe减少到原始大小的40%,但我想减少它。

MFC必须在此项目中静态链接。

我尝试过这个问题中列出的一些方法:reduce-windows-executable-size。特别是将不同的设置应用于编译器/链接器。

我相信通过查看项目中包含某些标题的“成本”,我可以进一步缩小规模。

关于如何解决这个问题的任何提示,也许是一个可以为我分析我的代码的工具? 感谢

5 个答案:

答案 0 :(得分:8)

你可能错了。删除标题可能会缩短构建时间,但由于它们包含的主要是声明(无论如何都需要它们),它们对最终可执行文件的大小影响很小或没有影响。

答案 1 :(得分:2)

减少项目大小的唯一方法是减少代码量。正如Neil所说,删除标题只会缩短构建时间。在执行“using namespace”子句时,编译器不会包含所有内容,它们只会选择所需的内容。另一方面,现在,如果你要在项目中的任何地方都没有使用的标题添加标题,这是一个应该删除的类的良好指示。

答案 2 :(得分:2)

您的假设显然是可执行文件大小在某种程度上是贡献组件的总和,特别是源文件。它只是不起作用。

例如,假设std::list<T>::size的代码。它可以用在许多翻译单元中。然而,链接器会将许多副本折叠在一起,有时甚至可以折叠到不同的类型T.但是,如何在exectuable中考虑结果字节?

现在,如果您甚至无法确定如何计算该简单(一组)函数的字节数,那么您将如何解释更复杂的结构?如果您不能将可执行文件中使用的字节分配给单个源文件,那么您无法确定个别贡献。

答案 3 :(得分:2)

标题通常只包含:

  1. 类型定义(如类)
  2. 函数转发声明(函数定义在.c / .cpp文件中)
  3. 除非.c /.cpp文件中的代码实际使用了机器代码,否则上述任何内容都不会导致生成机器代码。

    现在需要解析上述所有内容(这会增加编译时间),但除非实际使用,否则将被忽略。

答案 4 :(得分:1)

大多数现有答案都假设标头只包含声明,这对可执行文件大小没有影响。当然,如果这个假设成立,那也是如此,但是标题包含实际代码(通常是函数定义)变得相当普遍,并且那些确实对代码大小有贡献。

另一方面,如果这些函数实际链接到最终的可执行文件中,它们只会有所贡献。如果您调用这些功能,它们只会链接到最终的可执行文件中。因此,即使标题可能会增加您的可执行文件大小,您打算怎么做呢?您无法删除使用的代码。删除头文件不是一个选项 - 除非你将代码移动到其他地方,然后它将增加的可执行文件大小

因此,无论是标题都没有区别,或者它确实有所不同,因为您使用了其中的代码,然后无法将其删除。在任何一种情况下,删除标题都不会对你产生太大影响。