关于Tlist的问题!!!!!!(100分)

  • 主题发起人 主题发起人 faluk
  • 开始时间 开始时间
F

faluk

Unregistered / Unconfirmed
GUEST, unregistred user!
我在看classes中Tlist的过程中看到定义Tlist最大记录数是由maxsize=maxint div 16决定的。我查了maxint即为int的最大值,我想了解为什么最大记录数是由maxint div 16决定,我查了在delphi1中堆的大小有限制,后来就没有了,只与实际内存大小有关。请给予详细解答,为什么是maxint?为什么是除以16?
 
1、Maxint:win32 进程空间只能使用 2^32 (就是 4G) 的内存空间,通常来说 data 段最大只有一半,就是 MaxInt(使用一些方法可到 3G)
2、为什么是 16? TList 通过链表实现的,配在堆中,每个 Pointer(Integer) 占用 4 字节,此时最多应该有 MaxInt div 4 项
3、考虑 TList 使用 ReallocMem 重新分配、管理项,ReallocMem 是先分配大小,复制内容再释放旧数据的,按照 TList 分配空间的方法:
procedure TList.Grow;
var
Delta: Integer;
begin
if FCapacity > 64 then
Delta := FCapacity div 4
else
if FCapacity > 8 then
Delta := 16
else
Delta := 4;
SetCapacity(FCapacity + Delta);
end;
可得:total := maxsize + maxsize * ( 4/5); maxsize := total * (5/9) 差不多 1/2
就是说,最多应该有 MaxInt div 8 项
4、至于是 16,初步猜测是预留的?(那些 pointer 总得指向什么东西吧:);而且也可以适应未来新内存管理器的分配算法啊。
 
精辟!收藏
 
链表的话 元素 4字节 + 4字节指向兄弟
最大2G
2^32/2*(4+4)这样理解才是正解
 
=^0^=
应该是一维动态数组,因为这里使用链表不管是单双向,都浪费。
 
后退
顶部