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 总得指向什么东西吧:);而且也可以适应未来新内存管理器的分配算法啊。