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

前端之家收集整理的这篇文章主要介绍了为什么在包含程序时不会增加Delphi记录的大小?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个具有相同字段的记录,其中一个具有一组过程.为什么两个记录的大小是一样的?
  1. {$APPTYPE CONSOLE}
  2.  
  3. {$R *.res}
  4.  
  5. uses
  6. System.SysUtils;
  7.  
  8. type
  9. TData = record
  10. Age : Byte;
  11. Id : Integer;
  12. end;
  13.  
  14. TData2 = record
  15. Age : Byte;
  16. Id : Integer;
  17. procedure foo1;
  18. procedure foo2;
  19. procedure foo3;
  20. end;
  21.  
  22. procedure TData2.foo1;
  23. begin
  24.  
  25. end;
  26.  
  27. procedure TData2.foo2;
  28. begin
  29.  
  30. end;
  31.  
  32. procedure TData2.foo3;
  33. begin
  34.  
  35. end;
  36.  
  37. begin
  38. try
  39. Writeln('SizeOf(TData) = '+ IntToStr(SizeOf(TData)));
  40. Writeln('SizeOf(TData2) = '+ IntToStr(SizeOf(TData2)));
  41. Readln;
  42. except
  43. on E: Exception do
  44. Writeln(E.ClassName,': ',E.Message);
  45. end;
  46.  
  47. end.

解决方法

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

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

  1. TData2 = record
  2. Age : Byte;
  3. Id : Integer;
  4. procedure Foo1;
  5. procedure Foo2(SomeParam: Integer);
  6. end;

被改为等同于:

  1. PData2 = ^TData2;
  2.  
  3. TData2 = record
  4. Age : Byte;
  5. Id : Integer;
  6. end;
  7.  
  8. procedure TData2_Foo1(Self: PData2);
  9. procedure TData2_Foo2(Self: PData2; SomeParam: Integer);

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

  1. var
  2. Data: TData2;
  3. begin
  4. Data.Foo1;
  5. Data.Foo2(1);
  6. end;

改为等同于:

  1. var
  2. Data: TData2;
  3. begin
  4. TData2_Foo1(@Data);
  5. TData2_Foo1(@Data,1);
  6. end;

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

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

猜你在找的Delphi相关文章