gpt4 book ai didi

Delphi:在使用条款中列出未使用的单位有哪些缺点?

转载 作者:行者123 更新时间:2023-12-03 14:42:31 25 4
gpt4 key购买 nike

我使用cnPack Uses cleaner ,但总的来说,拥有无用的单位有哪些缺点?

我认识其中一些:

1)当然,如果该单元从未在整个项目中使用过,则会产生无用的资源消耗

2)代码洞察将给出无用的结果

3)代码洞察会变慢

但想象一个简单的情况:

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

最佳答案

没有。一般来说,智能链接的工作原理如下:

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

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

  • 主要是通过上述根任何可到达的(主程序、初始化、终结、可以构建的类的RTTI),
  • 如果单元已使用,则始终链接的一些位(资源、某些形式的 RTTI,如枚举),
  • RTL 中的语言帮助程序,例如 ansisstring 帮助程序例程,其中大部分位于系统中,有些可能存在变体。
  • 一些相对较小的内部程序管理(例如,具有确定初始化/最终化顺序的单元的表)、资源处理、DLL 链接等所需的表。
  • 调试信息(如果 TD32 打开)
  • 编译器设置(例如优化和运行时检查)也会轻微影响二进制大小。
  • 二进制压缩实用程序,例如 UPX。不过,我不推荐这些,因为根据我的经验,它们经常会引起问题。

Free Pascal 的工作方式大致相同,只是默认值不同;调试目前几乎总是“二进制”(如 TD32),并且在快照中,智能链接默认处于关闭状态。 (不过在官方版本中它是打开的)。

此外,我们不能忽视其重要性。整个 Strutils 最大约为 15kb。

(更新2011-11-01)

收到某人对我喜欢分享的回复的评论:

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

关于Delphi:在使用条款中列出未使用的单位有哪些缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4519726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com