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调用支持你的分析:
.因此,从任务管理器获得的数字可能不是很准确.您可以尝试使用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字节开销理论. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |