TPointerList ist nur ein Dummy-Typ. In TList wird ja einfach PPointerList verwendet. Der Compiler weiß dann, dass der Speicher, auf den der Pointer zeigt, ein array ist. Somit kann man direkt PPointerList
[i] aufrufen und der Compiler macht das restliche. Man könnte TPointerList auch definieren als array[0..0] of pointer. Es wird das gleiche rauskommen. Der Typ ist nur dafür da, damit man die eckigen Klammern benutzen kann.
Zitat von
Bomberbb:
@littleDave
TPointerList ist so definiert:
Delphi-Quellcode:
MaxListSize = Maxint div 16;
TPointerList = array[0..MaxListSize - 1] of Pointer;
Also wird gleich für die maximale Länge der Liste Speicher für die Pointer reserviert und dieser auch nicht zur Laufzeit verändert.
Gott sei dank: nein. Schau dir mal die Funktion
TList.SetCapacity an. Dort steht ein
ReallocMem, womit neuer Speicher angefragt bzw. wieder freigegeben wird.
Zitat von
Bomberbb:
Beim Löschen werden nicht alle folgenden Elemente zurückgeschoben, sondern nur der letzte gültige Pointer an die leere Stelle kopiert.
Leider auch nein:
Delphi-Quellcode:
procedure TList.Delete(Index: Integer);
begin
{ ... }
if Index < FCount then
// Mit dem Move-Befehl werden alle Pointer, die nach index kommen,
// um eine Position (4 Byte bei 32Bit-Systemen) nach vorne geschoben
System.Move(FList^[Index + 1], FList^[Index],
(FCount - Index) * SizeOf(Pointer));
{ ... }
end;