登陆

为什么const记录参数按值传递?

admin 2022-11-25 4人围观 ,发现0个评论

如果我有记录,例如

type   TMyRec = record     x : string;   end; 

还有一个procedure test(const x : TMyRec);.为什么该参数按值传递(即传递副本)而不是通过引用传递.我会从效率的角度考虑它应该通过引用传递(比如说整数).



1> Alister..:

看起来这与记录的大小有关

procedure test(const x : TMyRec); 

类型

type   TMyRec = record     x : Array[1..4] of byte;   end; 

将按值传递,并且

type   TMyRec = record     x : Array[1..5] of byte   end; 

将通过32位参考传递,对于64位,我们需要在东京(10.2.3)或更早的时候通过引用传递9个字节的记录,Rio(10.3)在32位和64位上表现相同.感谢所有对我的问题发表评论的人,并提供了额外的参考/建议.

请在此处查看东京文档.特别是

值和常量(const)参数按值或引用传递,具体取决于参数的类型和大小:

...

设置,记录和1,2或4个字节的静态数组作为8位,16位和32位值传递.较大的集合,记录和静态数组作为32位指针传递给该值.此规则的一个例外是记录总是直接在cdecl,stdcall和safecall约定下的堆栈上传递; 以这种方式传递的记录的大小向上舍入到最近的双字边界.

如果要强制传递引用,可以将参数声明为const [ref],如下所示:

procedure test(const [ref] x : TMyRec); 


@对于Delphi Rio,5字节记录也将通过64位引用传递.旧版本不是这样.这是力拓带来的变化之一.这样做是为32位和64位代码生成的头文件不必有所不同.
@David:它是有记录的,但仅限于[What's New](http://docwiki.embarcadero.com/RADStudio/Rio/en/What%27s_New#C.2B.2B.2FDelphi_ABI_compatibility)并且不太清楚:"在以前的版本中,ABI底层方法传递中存在微妙的平台差异,特别是对于通过值或引用传递的大小为4到8个字节的记录.
请发表您的评论
请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP