【发布时间】:2013-01-16 03:00:10
【问题描述】:
我有两条具有相同字段的记录,其中一条有一组程序。为什么两条记录的大小相同?
{$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.
【问题讨论】:
-
添加方法永远不会增加实例大小,它适用于记录实例和对象。
-
@DavidHeffernan - 不,它没有。它只增加类元数据,实例大小不会改变。除了通过字段增加实例大小的唯一方法是通过接口。
-
@Serg 你是对的,我错了。对不起。我认为每个实例都有一份 VMT 副本。我假设是因为虚拟方法拦截器。但这可以通过创建 VMT 的副本来实现。显然我需要在开口之前检查我的事实。
-
@DavidHeffernan - 是的,其他来自字段的实例包含指向 vtables 的指针 - 类 VMT 和用于接口的 vtables。此外,自 Delphi 2009 以来,还有一个隐藏字段可以实现监视器锁定。
-
'从 Delphi 2009 开始,还有一个隐藏字段可以实现监控锁'——又一次,有人在 Embarcadero 射杀了前 Java 开发人员。
标签: delphi delphi-xe2