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