在Delphi 64bit下,const参数和类型转换是否会像以前一样工作?

Jon*_*den 7 delphi 64-bit freepascal

作为一般规则,我通过利用Const(无类型)参数而不是硬编码类型来使用指针时绕过了许多经典设计陷阱.这使我在执行高级图形功能时具有速度优势,同时将技术细节留给编译器.它还使得在Delphi和Free Pascal中使用相同的代码变得容易,只需要进行很少的更改.但是,由于Embarcadero关于Delphi演变的vauge声明以及它的upcomming安全模型,我已经开始质疑这一点.

例如,concider以下示例:

Type TSomeDataProc = procedure (const aInput;var aOutput) of Object;

(* Convert 8-bit pixel to 16-bit pixel *)
Procedure TMyClass.ProcessSomeData08x565(Const aInput;var aOutput);
var r,g,b: Byte;
Begin
  FPalette.ExportTriplets(Byte(aInput),r,g,b);
  Word(aOutput):=(R SHR 3) SHL 11 or (G SHR 2) SHL 5 or (B SHR 3);
End;

(* Convert 16-bit pixel to 24-bit pixel *)
Procedure TMyClass.ProcessSomeData565x888(Const aInput;var aOutput);
Begin
  With TRGBTriple(aOutput) do
  Begin
   rgbtRed:=(((word(aInput) and $F800) shr 11) shl 3);
   rgbtGreen:= (((word(aInput) and $07E0) shr 5) shl 2);
   rgbtBlue:= ((word(aInput) and $001f) shl 3);
  end;
End;
Run Code Online (Sandbox Code Playgroud)

我们现在有两个具有相同声明的过程,但它们处理pixeldata的方式截然不同.这使我们可以使用查找表来获得正确的"转换器"方法.这应该在构造函数中或在分配图片位图的任何地方完成,如下所示:

Private
FLookup: Array[pf8bit..pf32bit,pf8bit..pf32bit] of TSomeDataProc;

Procedure TMyClass.Create;
Begin
  Inherited;
  FLookup[pf8bit,pf16bit]:=ProcessSomeData08x565;
  FLookup[pf16bit,pf24Bit]:=ProcessSomeData565x888;
end;
Run Code Online (Sandbox Code Playgroud)

每当我们需要转换像素时,我们只需查找正确的方法并使用它.所有程序的语法都保持不变 - 所以我们不必担心每个程序的"运行方式".就我们班级而言,它们看起来都一样.

Procedure TMyClass.ConvertTo(aFormat:TpixelFormat);
Begin
 // Get function for the correct pixel converter
 FConvertProc:=FLookup[CurrentFormat,aFormat];

 //Use the pixel converter
 FConvertProc(GetSourcePixelAddr(x,y),GetTargetPixelAddr(x,y));
end;
Run Code Online (Sandbox Code Playgroud)

问题是:这种类型转换(例如:Const to Byte或任何已定义的Record类型)是否会在64位下生存?我个人不知道为什么不这样做,但是Embarcadero对于新的"安全"模型和指针使用有点模糊,所以我觉得保护我的代码对于未来有点困难.

Arn*_*hez 3

由于 RTL 中使用了此类技巧,因此我认为在不破坏大量代码的情况下,我不会认为弃用 var 或 const 无类型参数。

Embarcadero 尽力保持尽可能多的向后兼容性。

在首先发出有关使用外部汇编器的通知之后,他们甚至应该在 64 位编译器中重新包含内联汇编。

而且这样的修改与 64 位模型没有任何关系,而 x86-64 汇编器是需要编写的新代码。

所以你应该将这个问题发布到Embarcadero官方新闻组,但我认为你不必担心这一点。