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

Delphi动态数组包含哪些簿记数据?,第1张

概述这是一个检查内存分配的简单程序.使用任务管理器检查值之前和之后建议每个动态数组占用大小为1的20字节内存.元素大小为4,这意味着簿记数据的开销为16字节. 从查看system.pas,我可以找到一个-4字节的数组长度字段,以及-8字节的引用计数,但我似乎无法找到对其他的任何引用8.任何人都知道他们做了什么? 示例程序: program Project1;{$APPTYPE CONSOLE} 这是一个检查内存分配的简单程序.使用任务管理器检查值之前和之后建议每个动态数组占用大小为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字节开销理论.

总结

以上是内存溢出为你收集整理的Delphi动态数组包含哪些簿记数据?全部内容,希望文章能够帮你解决Delphi动态数组包含哪些簿记数据?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1258619.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存