【问题标题】:What kind of metadata is generated by anonymous methods? And is there a way to remove it?匿名方法生成什么样的元数据?有没有办法删除它?
【发布时间】:2016-04-26 04:12:53
【问题描述】:

我正在使用工具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.

截图:

【问题讨论】:

    标签: delphi anonymous-methods delphi-10-seattle


    【解决方案1】:

    匿名函数由一个实现匿名函数工作所需接口的类支持。此处报告的元数据代表该类所需的信息。我不相信您可以将其从可执行文件中删除。

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

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

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

    TDemo.Demo$0$ActRec
    

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

    【讨论】:

    • 乍一看,这个问题看起来很傻。但是:我们确实使用了通用列表,并且根据工具TList<T>.Pack 生成了很多这种元数据,因为它为每个通用列表类型实例化。我认为对于这样一个基本的泛型类,应该在没有开销的情况下实现它!
    • 我能理解您的来源。但是,我真的不认为你可以做很多事情。您是否已将此情况报告给 Embarcadero?你的可执行文件大小中有多少是由匿名方法类组成的?
    • 我不能给你一个确切的数字,这个工具没有导出功能。最大单元(根据工具编译大小约为 1.8 MB)仅针对 Pack 方法获得高达 5% 的元数据和实现(组合)。但我不明白另一件事:对于这个特定的单元(没有 .dfm 文件),磁盘上的文件大小为 17 MB。所以地图文件和dcu之间似乎还有另一个区别。有没有分析编译的dcu文件的工具?
    • 那么,您在 .dcu 文件中寻找什么?我不认为它们在任何地方都有记录,因此任何工具都将基于逆向工程。我想我解释了匿名方法元数据是什么。
    • 恐怕你是对的,没有办法优化或进一步分析这种行为。
    猜你喜欢
    • 2016-04-11
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多