加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi动态数组包含哪些簿记数据?

发布时间:2020-12-15 09:26:48 所属栏目:大数据 来源:网络整理
导读:这是一个检查内存分配的简单程序.使用任务管理器检查值之前和之后建议每个动态数组占用大小为1的20字节内存.元素大小为4,这意味着簿记数据的开销为16字节. 从查看system.pas,我可以找到一个-4字节的数组长度字段,以及-8字节的引用计数,但我似乎无法找到对其
这是一个检查内存分配的简单程序.使用任务管理器检查值之前和之后建议每个动态数组占用大小为1的20字节内存.元素大小为4,这意味着簿记数据的开销为16字节.

从查看system.pas,我可以找到一个-4字节的数组长度字段,以及-8字节的引用计数,但我似乎无法找到对其他的任何引用8.任何人都知道他们做了什么?

示例程序:

program Project1;

{$APPTYPE CONSOLE}

type
   TDynArray = array of integer;
   TLotsOfArrays = array[1..1000000] of TDynArray;
   PLotsOfArrays = ^TLotsOfArrays;

procedure allocateArrays;
var
   arrays: PLotsOfArrays;
   i: integer;
begin
   new(arrays);
   for I := 1 to 1000000 do
      setLength(arrays^[i],1);
end;

begin
  readln;
  allocateArrays;
  readln;
end.

解决方法

我也看了一下System.pas并注意到_DynArrayCopyRange中的GetMem调用支持你的分析:

allocated size = count * element size
+ 2 * Sizeof(Longint)

.因此,从任务管理器获得的数字可能不是很准确.您可以尝试使用Pointer(someDynArray):= nil并检查FastMM报告的内存泄漏大小,以获得更可靠的数字.

编辑:我做了一个小测试程序:

program DynArrayLeak;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure Test;
var
  arr: array of Integer;
  i: Integer;
begin
  for i := 1 to 6 do
  begin
    SetLength(arr,i);
    Pointer(arr) := nil;
  end;
end;

begin
  ReportMemoryLeaksOnShutdown := True;
  Test;
end.

这产生了

  An unexpected memory leak has occurred. The unexpected small block leaks are:

  1 - 12 bytes: Unknown x 1
  13 - 20 bytes: Unknown x 2
  21 - 28 bytes: Unknown x 2
  29 - 36 bytes: Unknown x 1

它支持8字节开销理论.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读