我原来以为 TList 可能是一个链表, 其实只是一个数组而已. 你知道它包含着多大一个数组吗? MaxListSize 个! MaxListSize 是 Delphi 在 Classes 单元定义的一个常量: MaxListSize = Maxint div 16; 也就是 134217727; 这也是 TList 的最大容量. 其中的 Maxint(2147483647) 也就是 2个G, 这是 Win32 系统许可一个应用程序对空间的最大操控权; 16 是一个 TList 的大小. 可以测试一下:
var List: TList;begin List := TList.Create; ShowMessage(IntToStr(List.InstanceSize)); {16} List.Free;end;
如果一个类真的包含一个 2个G 大小的数组, 这是不可想想的, 类一建立程序就死定了; 巧妙的是 TList 只是使用了这个数组的指针! Delphi 已经为这个数组和数组指针都做了定义:
PPointerList = ^TPointerList;TPointerList = array[0..MaxListSize - 1] of Pointer;
这样以来, 我们使用多少就去申请多少内存空间就是了. 关于指针和申请内存空间还是应该多了解一点; 因为 TList 的核心就是这个数组的指针!