我正在使用工具 MapFileStats从 delphi 检查生成的 map 文件。我发现匿名方法会生成某种元数据,这似乎与 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.
截屏:
最佳答案
匿名函数由一个类支持,该类实现匿名函数工作所需的接口(interface)。此处报告的元数据代表该类所需的信息。我不相信您可以将其从可执行文件中删除。
以下将发出实现匿名方法的对象的类的名称:
Writeln((IInterface(Pointer(@AProc)^) as TObject).ClassName);
添加到第二个程序时,输出为:
TDemo.Demo$0$ActRec
这与您在问题中突出显示的名称相同。
关于delphi - 匿名方法生成什么样的元数据?有没有办法删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34897954/