加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

为什么在包含程序时不会增加Delphi记录的大小?

发布时间:2020-12-15 04:03:13 所属栏目:大数据 来源:网络整理
导读:我有两个具有相同字段的记录,其中一个具有一组过程.为什么两个记录的大小是一样的? {$APPTYPE CONSOLE}{$R *.res}uses System.SysUtils;type TData = record Age : Byte; Id : Integer; end; TData2 = record Age : Byte; Id : Integer; procedure foo1; pr
我有两个具有相同字段的记录,其中一个具有一组过程.为什么两个记录的大小是一样的?
{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TData = record
    Age : Byte;
    Id  : Integer;
  end;

  TData2 = record
    Age : Byte;
    Id  : Integer;
    procedure foo1;
    procedure foo2;
    procedure foo3;
  end;

procedure TData2.foo1;
begin

end;

procedure TData2.foo2;
begin

end;

procedure TData2.foo3;
begin

end;

begin
  try
    Writeln('SizeOf(TData) = '+ IntToStr(SizeOf(TData)));
    Writeln('SizeOf(TData2) = '+ IntToStr(SizeOf(TData2)));
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName,': ',E.Message);
  end;

end.

解决方法

那是因为记录本身只带有组成记录的数据而没有程序或功能.程序和函数是一种语法糖,可以避免将记录本身作为参数传递:编译器为您自动添加的自变量.

您在记录中声明的每个方法都有另一个记录本身的参数,例如:

TData2 = record
    Age : Byte;
    Id  : Integer;
    procedure Foo1;
    procedure Foo2(SomeParam: Integer);
  end;

被改为等同于:

PData2 = ^TData2;

  TData2 = record
    Age : Byte;
    Id  : Integer;
  end;

  procedure TData2_Foo1(Self: PData2);
  procedure TData2_Foo2(Self: PData2; SomeParam: Integer);

结束你所做的每个电话也会改变,例如:

var
  Data: TData2;
begin
  Data.Foo1;
  Data.Foo2(1);
end;

改为等同于:

var
  Data: TData2;
begin
  TData2_Foo1(@Data);
  TData2_Foo1(@Data,1);
end;

我手边没有Delphi来检查参数列表的开头或末尾是否添加了参数,但我希望你明白这一点.

当然,没有真正的语法,因为它是由编译器即时完成的,因此,例如,过程名称不会改变.我这样做是为了让我的答案易于理解.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读