Delphi中的使用单元序列

jus*_*tyy 3 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',
Run Code Online (Sandbox Code Playgroud)

我为什么要打扰订单呢?

Rud*_*uis 7

可能有以下几个原因:

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

请注意,无法保证订单得以保留.如果其中一个单元使用另一个单元,则必须首先加载该单元.为了使单位真正最先,使其成为第一.dpr.dpk文件.


Dav*_*nan 5

这里有三个独立的代码:

  1. FastMM
  2. VCLFixPack
  3. FastCode

在执行任何堆分配之前,安装替换内存管理器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',  
  ....
Run Code Online (Sandbox Code Playgroud)

FastCode之前说过,VCLFixPack因为逻辑上RTL的级别低于VCL.然而,无论如何都无关紧要.但你必须选择一个,这是我的推理.

我也省略了对FastMove单位的明确引用.这FastCode与其他许多单位一起使用,如果你要省略其他单位,你也可以省略FastMove.