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

时间:2018-12-09 21:36:08

标签: delphi parameters record

如果我有记录,例如

type
  TMyRec = record
    x : string;
  end;

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

1 个答案:

答案 0 :(得分:6)

这似乎与记录的大小有关,

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位,我们将需要9个字节的记录才能在Tokyo(10.2.3)或更早版本上通过引用传递,Rio(10.3)在32和64上的行为相同一点。感谢所有对我的问题发表评论并提供其他参考/建议的人。

请参阅《东京文档》 here。特别是

  

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

...

  

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

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

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