Delphi中使用单元的顺序

3
我想知道以下使用单元顺序是否正确。
uses
  FastMM4 in 'Fast\FastMM4\FastMM4.pas',
  VCLFixPack in 'VCLFixPack.pas',  
  FastMove in 'Fast\FastMove\FastMove.pas',
  FastCode in 'Fast\FastCode\FastCode.pas',
  FastMM4Messages in 'Fast\FastMM4\FastMM4Messages.pas',

为什么我需要关注订单?

1
也许你可以解释一下这些单元都是什么。我认为我们知道FastMM单元。但其他的呢?它们从哪里来?它们是做什么的?就个人而言,我认为没有必要将两个FastMM单元拆分开来。 - David Heffernan
@DavidHeffernan http://andy.jgknet.de/blog/ 和 http://www.fastcode.dk/fastcodeproject/fastcodeproject/FastMove.pas 以及 http://read.pudn.com/downloads134/sourcecode/delphi_control/569774/FastCode.pas__.htm - justyy
2个回答

7
可能有几个原因:
  • 某些单元在启动时执行操作。这些操作的顺序可能很重要,例如 FastMM4,它将默认的内存管理器替换为自己的。在分配任何内存之前应该先执行此操作。
  • 如果有多个单元包含重复的标识符,则“最后”一个会覆盖以前的标识符。这可能是有意为之,也可能是偶然发生的。其他标识符仍然可以访问,但需要在单元名称的限定下才能使用。
  • 和启动时操作一样,生命周期末尾的操作也可能很重要,它们的顺序也很重要。

请注意,不能保证按照特定的顺序加载这些单元。如果其中一个单元使用了另一个单元,则必须先加载该单元。要使一个单元真正成为第一个,将其放在 .dpr.dpk 文件中的第一位。


1
第二点的一个例子是TBitmap,它在WindowsGraphics单元中都有定义。+1 - jpfollenius
是的,我总是明确地使用 Windows.TBitmap 或 Graphics.TBitmap 来避免错误。 :) - justyy
如果你故意覆盖其他单元,那么就像Raymond Hettinger所说的那样,“...那么你就是在犯罪,应该承担任何后果!” +1 为答案。 - alcalde
FastMM确实覆盖了默认的内存管理器。好吧,那也是FastMM,但并非所有诊断都包含在内。有时候单位会被写成“override”(或隐藏、替换等),目的是为了特定标识符。我个人不太喜欢这样做,但它确实有效。 - Rudy Velthuis

5

这里有三个独立的代码片段:

  1. FastMM
  2. VCLFixPack
  3. FastCode

在执行任何堆分配之前,安装替换内存管理器FastMM非常重要。因此,我认为必须首先包含它。你也可以将两个FastMM单元放在一起。

其他单元对内存中的代码进行更改,以修复错误(VCLFixPack)或提高性能(FastCode)。尽管你已经单独标识了FastMoveFastCode,但实际上,FastCode单元实际上安装了一套改进的函数,定义在十几个单独的单元中。

很可能在包含VCL单元之前安装VCL修复程序非常重要。因此,在任何VCL单元之前应出现VCLFixPack。

至于FastCode,由于它仅影响性能,因此可以在.dpr文件的任何位置使用它。初始化代码是否与vanilla RTL代码一起运行可能并不重要。话虽如此,为了保持一致性,最好将所有更改运行时行为的单元放在一起。因此,我会像这样编写你的.dpr uses子句:

uses
  FastMM4 in 'Fast\FastMM4\FastMM4.pas',
  FastMM4Messages in 'Fast\FastMM4\FastMM4Messages.pas',
  FastCode in 'Fast\FastCode\FastCode.pas',
  VCLFixPack in 'VCLFixPack.pas',  
  ....

我把 FastCode 放在 VCLFixPack 之前,因为逻辑上 RTL 处于比 VCL 更低的级别。然而,无论怎样都没有关系。但你必须选择一个,这就是我的理由。

我还省略了对 FastMove 单元的明确引用。它与大量其他单元一起被 FastCode 使用,如果要省略其他单元,那么也可以省略 FastMove


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接