Delphi中的使用单元序列

时间:2014-05-27 09:32:02

标签: delphi

我想知道以下使用单位顺序是否正确。

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',

为什么我要为订单烦恼?

2 个答案:

答案 0 :(得分:7)

可能有以下几个原因:

  • 某些单位在启动时执行操作。这些操作的顺序可能很重要,例如FastMM4,它用自己的内存管理器替换默认的内存管理器。这应该在分配任何内存之前完成。
  • 如果多个单元包含重复的标识符,那么" last"一个覆盖前一个。这可能是故意的,也可能是偶然的。其他标识符仍可访问,但不具备单位名称的限定条件。
  • 与启动时的行动相同,生命结束时的行动也很重要,以及他们的命令。

请注意,不保证订单会被保留。如果其中一个单元使用另一个单元,则必须首先加载该单元。要使单元真正成为第一个,请将其作为.dpr.dpk文件中的第一个。

答案 1 :(得分:5)

这里有三段独立的代码:

  1. FastMM
  2. VCLFixPack
  3. FastCode
  4. 在执行任何堆分配之前,安装替换内存管理器FastMM非常重要。所以我认为很明显,必须是第一个包含的单位。你也可以将两个FastMM单元放在一起。

    其他单元更改内存中的代码,修复错误(VCLFixPack)或提高性能(FastCode)。虽然您已单独确定FastMoveFastCode,但实际上FastCode单元实际上安装了一套改进的功能,这些功能是在十几个单独的单独单元中定义的。

    在包含VCL单元之前安装VCL修复程序似乎很可能很重要。所以VCLFixPack应该出现在任何VCL单元之前。

    对于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