匿名方法生成什么样的元数据?有没有办法删除它?
What kind of metadata is generated by anonymous methods? And is there a way to remove it?
我正在使用工具 MapFileStats 检查从 delphi 生成的地图文件。我发现匿名方法会生成某种元数据,这似乎与 RTTI 无关。它是什么样的元数据?删除它会很好,因为在我们的生产环境中它总计非常大。
示例代码:
program RttiDemo;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
{$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}
{$WEAKLINKRTTI OFF}
var
AProc: TProc;
begin
try
AProc := procedure()
begin
// ...
end;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.
MapFileStats 的屏幕截图:
另一个例子:
program RttiDemo;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
{$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}
{$WEAKLINKRTTI OFF}
type
TDemo = class
procedure Demo();
end;
procedure TDemo.Demo;
var
AProc: TProc;
begin
AProc := procedure()
var
i: Integer;
begin
i := 5;
WriteLn(i);
end;
AProc();
end;
var
Demo: TDemo;
begin
Demo := TDemo.Create();
try
Demo.Demo;
finally
FreeAndNil(Demo);
end;
end.
截图:
匿名函数由 class 支持,后者实现匿名函数工作所需的接口。此处报告的元数据表示 class 所需的信息。我不相信你可以从你的可执行文件中删除它。
以下将发出实现匿名方法的对象的 class 的名称:
Writeln((IInterface(Pointer(@AProc)^) as TObject).ClassName);
添加到您的第二个程序后,输出为:
TDemo.Demo[=11=]$ActRec
这与您在问题中突出显示的名称相同。
我正在使用工具 MapFileStats 检查从 delphi 生成的地图文件。我发现匿名方法会生成某种元数据,这似乎与 RTTI 无关。它是什么样的元数据?删除它会很好,因为在我们的生产环境中它总计非常大。
示例代码:
program RttiDemo;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
{$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}
{$WEAKLINKRTTI OFF}
var
AProc: TProc;
begin
try
AProc := procedure()
begin
// ...
end;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.
MapFileStats 的屏幕截图:
另一个例子:
program RttiDemo;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
{$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}
{$WEAKLINKRTTI OFF}
type
TDemo = class
procedure Demo();
end;
procedure TDemo.Demo;
var
AProc: TProc;
begin
AProc := procedure()
var
i: Integer;
begin
i := 5;
WriteLn(i);
end;
AProc();
end;
var
Demo: TDemo;
begin
Demo := TDemo.Create();
try
Demo.Demo;
finally
FreeAndNil(Demo);
end;
end.
截图:
匿名函数由 class 支持,后者实现匿名函数工作所需的接口。此处报告的元数据表示 class 所需的信息。我不相信你可以从你的可执行文件中删除它。
以下将发出实现匿名方法的对象的 class 的名称:
Writeln((IInterface(Pointer(@AProc)^) as TObject).ClassName);
添加到您的第二个程序后,输出为:
TDemo.Demo[=11=]$ActRec
这与您在问题中突出显示的名称相同。