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

作为一般规则,当通过利用Const(无类型)参数而非硬编码类型使用指针时,我规避了许多经典设计陷阱。 这使我在执行高级图形函数时获得了速度上的优势,同时让技术细节直至编译器。 它也使得在Delphi和Free Pascal中使用相同的代码变得很简单,但是最近我开始怀疑这是由于Embarcadero关于Delphi发展的大规模声明以及它的安全模型。

例如,对以下示例进行简化:

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 to Byte或任何已定义的记录类型)是否会在64位下生存? 我个人不明白为什么不这样做,但Embarcadero对新的“安全”模型和指针使用有点模糊,所以我觉得为将来保护我的代码有点难。


由于RTL中使用了这样的技巧,因此我没有看到在没有大量代码中断的情况下弃用var或const无类型参数。

英巴卡迪诺尽其所能保持尽可能多的向后兼容性。

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

这种修改与64位模型没有任何关系,而x86-64汇编器是一段新的代码。

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


请注意,FPC已经改变了CONST参数,虽然在这种情况下不是。

对于正常情况,对于所有的调用约定,CONST不再被引用保证,而是遵循各自的ABI指定的内容。 一个新的参数类型,CONSTREF保证是通过引用。

就像所有兼容性的破坏一样,在TP / Delphi CONST中总是通过引用来解决问题,但TP / Delphi也一直是x86。

其中所有STDCALL函数都会更改,例如IUnknown.Queryinterface:

http://wiki.freepascal.org/User_Changes_Trunk#IInterface.QueryInterface.2C_._AddRef_and_._Release_definitions_have_been_changed

原因或多或少,在这些情况下,x86 ABI信息进入了通用接口,这是非跨体系结构兼容的。 所以人们必须猜测它是否是该语言的一部分,或者是该语言的x86实现的一部分。

请注意,IUnknown也可用于其他平台,例如Firefox的XPCOM

Delphi也可能遇到这样的问题,但我认为它们主要会影响具有显式调用约定要求的函数/方法,因为可以根据需要更改内部约定,但实际上并不能改变世界其他地方((XP) COM或现有的C(++)库)以适应Delphi中的现有代码

链接地址: http://www.djcxy.com/p/50455.html

上一篇: Will const parameters and typecasting work as before under Delphi 64bit?

下一篇: Scaling a High Score Database