1

我有兴趣减少我的应用程序的文件大小。它是在 Visual Studio 2008 中使用 MVC++ 构建的 MFC/C++ 应用程序。UPX 在将最终 exe 减少到其原始大小的 40% 方面做得很好,但我想减少更多。

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

我尝试了这个问题中概述的一些方法:reduce-windows-executable-size。专门将不同的设置应用于编译器/链接器。

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

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

4

5 回答 5

8

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

于 2009-12-16T14:13:15.363 回答
2

减少项目规模的唯一方法是减少代码量。正如 Neil 所说,删除标头只会缩短构建时间。编译器在执行“使用命名空间”子句时不会包含所有内容,他们只会选择需要的内容。现在,另一方面,如果您要向项目中任何地方都没有使用的东西添加标题,这很好地表明应该删除一个类。

于 2009-12-16T14:17:53.717 回答
2

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

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

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

于 2009-12-16T14:20:39.140 回答
2

标头通常仅包含:

  1. 类型定义(如类)
  2. 函数前向声明(函数定义在.c/.cpp文件中)

除非您的 .c /.cpp 文件中的代码实际使用它们,否则上述所有操作都不会实际生成机器代码。

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

于 2009-12-16T14:43:09.047 回答
1

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

另一方面,它们仅在这些函数实际链接到最终可执行文件时才起作用。如果您调用这些函数,它们只会链接到最终的可执行文件中。因此,即使标头可能会增加您的可执行文件大小,您将如何处理它?您不能删除您使用的代码。删除头文件就不是一个选项 - 除非您将该代码移到其他地方,然后无论如何它都会增加可执行文件的大小。

所以要么一个标题没有区别,要么它确实有区别,因为你使用了其中的代码,然后它就不能被删除。在任何一种情况下,删除标题都不会给你带来太多好处。

于 2009-12-16T14:56:59.490 回答