代码之家  ›  专栏  ›  技术社区  ›  Alister

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

  •  2
  • Alister  · 技术社区  · 6 年前

    如果我有记录,例如。

    type
      TMyRec = record
        x : string;
      end;
    

    procedure test(const x : TMyRec);

    1 回复  |  直到 6 年前
        1
  •  6
  •   Johan    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 . 特别地

    ...

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

    const [ref] ,例如:

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