【问题标题】:Determine an included header files contribution to total file size确定包含的头文件对总文件大小的贡献
【发布时间】:2009-12-16 14:09:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 感谢您的回答,感谢您的宝贵时间。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        标题通常只包含:

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

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2011-03-17
            • 2010-11-04
            • 2012-07-29
            • 1970-01-01
            • 1970-01-01
            • 2011-03-27
            • 1970-01-01
            • 2016-08-05
            • 1970-01-01
            相关资源
            最近更新 更多