我有两个具有相同字段的记录,其中一个具有一组过程.为什么两个记录的大小是一样的?
- {$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来检查参数列表的开头或末尾是否添加了参数,但我希望你明白这一点.
当然,没有真正的语法,因为它是由编译器即时完成的,因此,例如,过程名称不会改变.我这样做是为了让我的答案易于理解.