2009-12-16 64 views
1

我有兴趣减少我的应用程序的文件大小。它是一个在Visual Studio 2008中使用MVC++构建的MFC/C++应用程序。UPX将最终的exe减少到其原始大小的40%,但我希望更多地减少它。确定包含的头文件对整个文件大小的贡献

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

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

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

任何提示如何去做这件事,也许一个工具,可以为我分析我的代码? 谢谢

+0

谢谢你的答案,我很欣赏你的时间。 – Andrew 2009-12-16 14:50:03

回答

8

你可能是错误的。删除头文件可能会缩短构建时间,但由于它们包含的主要是声明(无论如何您都需要这些声明),因此它们对最终可执行文件的大小应该只有很小的影响或没有影响。

+1

(+1)这是正确的答案。 – 2009-12-16 14:40:53

2

缩小项目大小的唯一方法是减少代码量。正如尼尔所说,删除标题只会缩短构建时间。编译器在执行“使用命名空间”子句时不会包含所有内容,只会选择所需的内容。另一方面,现在,如果您将项目标题添加到项目中任何地方都没有使用的东西,那么该标题就是应该删除的类的一个很好的指示。

2

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

例如,假定代码为std::list<T>::size。它可能用于许多翻译单位。然而,链接器会将许多副本折叠在一起,有时甚至是针对不同的类型T.但是,如何解释可执行文件中的结果字节?

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

2

集管通常仅包含:

  1. 类型定义(如班)
  2. 功能向前声明(函数定义在.C/cpp文件)

以上都不是真正导致机器代码被生成,除非它们被.c /.cpp文件中的代码实际使用。

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

1

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

在另一方面,如果这些功能实际上是链接到最终的可执行他们只贡献。他们只是链接到最终的可执行文件,如果你电话这些功能。所以即使头文件可能有助于增加可执行文件的大小,你会怎么做呢?您不能删除您使用使用的代码。删除头文件只是不是一个选项,然后 - 除非您移动代码别的地方,然后它会增加可执行文件的大小反正

所以不管是头部没有什么区别,或者它确实有差别,因为您使用的是在它的代码,然后它不能被删除。无论在哪种情况下,删除标题都不会为您购买太多。