gpt4 book ai didi

delphi - 在 Delphi 64 位下 const 参数和类型转换会像以前一样工作吗?

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

作为一般规则,我通过利用 Const(无类型)参数而不是硬编码类型,在使用指针时规避了许多经典设计陷阱。这使我在执行高级图形函数时获得了速度优势,同时将技术细节留给了编译器。它还使得在 Delphi 和 Free Pascal 中使用相同的代码只需进行最小的更改变得很容易。然而,最近,由于 Embarcadero 对 Delphi 的演变及其即将推出的安全模型的 vauge 声明,我开始对此提出质疑。

例如,考虑以下示例:

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;

我们现在有两个具有相同声明的过程,但它们处理像素数据的方式非常不同。这给我们带来了使用查找表来获得正确的“转换器”方法的好处。这应该在构造函数中或在分配图片位图的任何地方完成,如下所示:

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

Procedure TMyClass.Create;
Begin
Inherited;
FLookup[pf8bit,pf16bit]:=ProcessSomeData08x565;
FLookup[pf16bit,pf24Bit]:=ProcessSomeData565x888;
end;

每当我们需要转换像素时,我们只需查找正确的方法并使用它即可。所有过程的语法保持相同 - 因此我们不必担心每个过程“如何”运行。就我们类而言,他们看起来都一样。

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;

问题是:这种类型转换(例如:Const 到 Byte 或任何定义的 Record 类型)能够在 64 位下生存吗?我个人不明白为什么不,但是 Embarcadero 对于新的“安全”模型和指针使用有点模糊,所以我发现 future 保护我的代码有点困难。

最佳答案

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

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

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

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

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

关于delphi - 在 Delphi 64 位下 const 参数和类型转换会像以前一样工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4852092/

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