德尔福:在使用条款中列出未使用单位的缺点是什么?

时间:2010-12-23 14:42:25

标签: delphi uses-clause

我使用cnPack Uses cleaner,但一般情况下哪些是无用单位的缺点?

我知道其中一些:

1)当然,如果整个项目中没有使用该单元,那么将会出现无用的资源消耗

2)代码洞察力会产生无用的结果

3)代码洞察力会变慢

但想象一个简单的案例:

  • 我有一个包含2个表单的项目,我在其中一个表单中使用了StrUtils,但我在两个表单中都声明了StrUtils ......在这种情况下,是否存在内存消耗的缺点?

3 个答案:

答案 0 :(得分:15)

没有。通常,smartlinking的工作方式如下:

  • 如果您在某个地方使用某个单元,则至少会链接 inialization和finalization 代码。
  • 原则上,只有您实际使用的功能/方法直接或间接来自主程序(。dpr)。
  • 可通过 RTTI 访问的某些位也将被链接。经验法则是枚举的RTTI始终链接(如果您使用枚举),那(就在您构建一个类),所有已发布,或通过已发布属性可访问的内容都链接在。
  • 请记住,未使用单元的初始化可能会引入 dll 甚至整个dll框架(如.NET),这可能是一种不必要的部署复杂化。
  • (正如Rob在评论中所说)资源是另一个始终链接的因素,因为由于运行时的使用,编译器无法确定它们是否被使用。

结论:确定最终的.exe大小

  • 主要由上面的任何可到达的(主程序,初始化,终结,可以构建的类的RTTI),
  • 如果单位是USED(资源,某些形式的RTTI,如枚举),则总是链接的一些位,
  • RTL中的
  • 语言助手,就像ansistring助手例程一样,其中大多数都在System中,有些可能是变体。
  • 一些相对较小的内部程序管理(例如,包含确定初始化/完成顺序的单元的表),资源处理所需的表,DLL链接等。
  • 调试信息(如果TD32开启)
  • 编译器设置,如优化和运行时检查也会轻微影响二进制文件大小。
  • 二进制压缩工具,如UPX。我不建议这些,因为根据我的经验,他们经常会遇到问题。

Free Pascal大致以相同的方式工作,默认值只是不同; Debug目前几乎总是“二进制”(如TD32),而在快照中,默认情况下,smartlinking处于关闭状态。 (在正式版本中,它正在开启)。

此外,人们不应忽视这种程度。 Strutils完全像15kb。

(更新2011-11-01)

对于我希望分享此回复的某人的评论:

基本上他对枚举总是被链接的说法表示怀疑。也许注册一个具有enum类型的已发布属性的类会拖入它们。这个推理有道理,但我还没有测试过。因此,如果在某处查询typeinfo(tenumtype),或者如果在所使用的类的已发布部分中使用它,则只能直接链接枚举的RTTI。 (直接或查询typeinfo(theclass))

答案 1 :(得分:7)

Delphi智能链接器将忽略未使用的代码,因此通常这些“额外”单元的存在不会增加编译程序的大小。

以下是我从this link获得的关于未使用单位缺点的一些观点

  1. 要维护的清洁代码,无需担心未使用的代码
  2. 未使用单元中的初始化和终结部分的代码未在
  3. 中链接
  4. 编译运行更顺畅,更快

答案 2 :(得分:5)

在我看来,最大的问题是你有时会被Delphi的范围规则所困扰。如果在不同的单元中有两个具有相同名称的标识符,则使用此名称是指在uses子句中声明为最新的单元中声明的名称。

如果您遇到问题,您可以随时完全指定标识符。我真正希望看到的是编译器警告,告诉您是否命名了一个标识符,该标识符的标识仅由uses子句范围规则中的最新声明确定。