如何从EXE文件中删除死代码?

时间:2012-11-05 21:24:53

标签: delphi delphi-xe2 dead-code

  

可能重复:
  Reduce exe file

在给定EXE文件的情况下,有哪些工具可以删除所有未使用的代码并使用应用程序实际使用的代码创建一个新的EXE文件?我认为这样的事情应该存在。只是为了好奇;但我认为它可以作为生成较小的EXE文件而没有未使用的代码的工具。

P.S。:Delphi生成独立的EXE文件,其中包含应用程序中使用的所有对象的代码,但并非真正使用此对象的所有元素。这使得大文件。 我记得Pascal的第一个版本只包含真正使用过的代码,并没有插入未使用的代码,EXE文件也较小。

2 个答案:

答案 0 :(得分:1)

当前的Delphi也排除了未使用的代码。您可以在Delphi中轻松看到这一点。如果你编译,你会在代码的阴沟中得到“蓝点”。未使用的功能没有蓝点,这意味着它们被排除在外。如果检查项目选项中的优化复选框,则会重写代码以更多地使用寄存器,从而消除某些变量。

然而,Delphi可执行文件增长,特别是在使用某些单元时。我认为你在Delphi 7中创建的最小的.exe大约是10Kb。在以后的版本中,这可能会更大一些。

文件大小的重要原因是

  1. 资源。大量或大量图像会占用大量空间。如果在多个表单上使用图标,请确保将它们放在中央图像列表中(在共享数据源上)。使用其中一个可用的PngImageList实现来获得更小的图像尺寸,以提高质量。
  2. RTTI。运行时类型信息导致类定义占用额外空间。这个空间部分是由于关于类的元信息,但主要是因为所有额外的代码。可以使用RTTI调用的任何方法都可以以一种“后期绑定”方式绑定。因此,编译器无法知道是否可以消除这些方法,因此需要将它们包含在可执行文件中。
  3. 注册课程。与2.类似。如果注册了类,则可以使用其名称作为字符串来获取和实例化它。这些类必须包含在项目中,即使它们从未使用过,只是因为编译器无法知道它们是否需要。
  4. 事实上,RTTI在最近的Delphi版本中得到了扩展。我认为这也会导致关于类的RTTI元信息占用更多空间。你可以做的就是这么多。

    总的来说,我认为Delphi编译器仍然进行了大量的优化。您不必担心exe文件大小。如果你这样做,你可以试试像upx这样的包装工。我对upx有很好的经验。它将可执行文件减少到原始大小的五分之一或更小,同时保留所有功能。

答案 1 :(得分:0)

如果您的应用程序很庞大,请检查您是否编译了很多调试信息。 尝试发布版本并检查它是否更小。

我有时会做的是配置项目以将所有.dcu文件编译到单个文件夹中。通过这种方式,您可以快速查看编译到.exe中的所有无用单元。通常情况下,您为单个函数包含一个单元,但反过来又会得到整个依赖单元树。你只需要搜索你的使用条款,并尝试以某种方式摆脱这些依赖。

我认为gexperts和cnpack都包含显示依赖关系的工具,或者扫描项目中未使用的单元。他们可以为此提供帮助。

在删除无用的依赖项之后,您始终可以使用upx压缩已编译的exe。有一些不利之处(巴里凯利不久前写过这篇文章),但我有很好的经验。它有时会使文件4x变小,这可能是一件大事。

相关问题