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

LaB*_*cca 9 delphi uses-clause

我使用cnPack使用清洁剂,但一般来说这是无用单位的缺点?

我知道其中一些:

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

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

3)代码洞察力会变慢

但想象一个简单的案例:

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

Mar*_*ort 15

不.通常,smartlinking的工作方式如下:

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

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

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

免费Pascal大致以相同的方式工作,默认值只是不同; Debug目前几乎总是"二进制"(如TD32),而在快照中,默认情况下,smartlinking处于关闭状态.(虽然正式发布,但它已经开启).

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

(更新2011-11-01)

从某人那里得到了一条评论我喜欢分享:

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

  • **资源文件**也可以通过使用单元来包含,即使您没有使用单元中的代码。(这就是 TXPManifest 组件的全部目的,引入 XPMan 单元,该单元链接到默认清单资源中。该组件本身不执行任何操作,但将其放在表单上会使 IDE 将该单元添加到您的项目中。) (2认同)

Bha*_*rat 7

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

以下是我从这个链接获得的关于未使用单位缺点的一些观点

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


Dav*_*nan 5

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

如果您因此遇到问题,则可以始终完全指定标识符.我真的很想看到的是编译器警告,告诉您是否命名了一个标识符,该标识符的标识仅由uses子句范围规则中的最新声明确定.