匿名方法生成什么样的元数据?有没有办法删除它?

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 的屏幕截图:

Screenshot displaying MailFileStats

另一个例子:

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.

截图:

another MapFileStats screenshot

匿名函数由 class 支持,后者实现匿名函数工作所需的接口。此处报告的元数据表示 class 所需的信息。我不相信你可以从你的可执行文件中删除它。

以下将发出实现匿名方法的对象的 class 的名称:

Writeln((IInterface(Pointer(@AProc)^) as TObject).ClassName);

添加到您的第二个程序后,输出为:

TDemo.Demo[=11=]$ActRec

这与您在问题中突出显示的名称相同。