Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Speicherbedarf von TStringList (https://www.delphipraxis.net/40619-speicherbedarf-von-tstringlist.html)

DevilsCamp 18. Feb 2005 10:15


Speicherbedarf von TStringList
 
Weiß einer von euch, wie ich den gesamten Speicherbedarf einer gefüllten TStringList bekomme?

mit:
Delphi-Quellcode:
speicher := Length(StringList1.Text)+SizeOf(TStringList)
???


Oder anders?

Chewie 18. Feb 2005 10:29

Re: Speicherbedarf von TStringList
 
Das wird schwierig. Ein Objekt vom Typ TStringList belegt zunächst einmal TStringList.InstanceSize Bytes an Speicher, dieser Wert ist konstant. Dabei sind Zeiger auf die Objekt- und Stringlisten, die wiederum Speicher einnehmen. Die Elemente in der Objektliste können wiederum Zeiger auf andere Speicherbereiche haben usw...

Für den allgmeinen Fall lässt sich diese Frage also nicht genau beantworten.

DevilsCamp 18. Feb 2005 10:32

Re: Speicherbedarf von TStringList
 
das ist doof. :(


Ich habe nämlich folgenden Code:
Delphi-Quellcode:
var
stlarr : array of TStringList;
und würde gerne wissen, wieviel Speicher das ganze verbraucht um evtl. eine Optimierung vornehmen zu können...


<edit>
in der StringList werden immer nur Strings vom Typ String[12] gespeichert...
</edit>

himitsu 18. Feb 2005 11:38

Re: Speicherbedarf von TStringList
 
dann nimm doch ein Array of Array of String[12], das ist vermutlich

4 Byte (für den Zeiger auf das Array) + 4 Byte für die Arraylänge + 13 Byte für jeden der Strings (12 Zeichen + 1 Längenbyte, da Shortstring)

das würde dann wohl so berechnet?
Delphi-Quellcode:
Groesse := 8;
for i := Low(ARRAY) to High(ARRAY) do
  Inc(Groesse, 8 + 13 * Length(ARRAY[i]));

jbg 18. Feb 2005 11:43

Re: Speicherbedarf von TStringList
 
Zitat:

Zitat von DevilsCamp
und würde gerne wissen, wieviel Speicher das ganze verbraucht um evtl. eine Optimierung vornehmen zu können...

Length(stlarr) * SizeOf(Pointer) + 8

Wobei aber der von TStringList reservierte Speicher nicht eingerechnet ist, da dein Array bis jetzt nur "NIL" enthält.

Zitat:

in der StringList werden immer nur Strings vom Typ String[12] gespeichert...
Das interessiert die StringList nicht. Die hält ihre Daten in einem AnsiString und der ist dynamisch. AnsiString braucht immer 4 Byte (Zeiger) und dann je nach Inhalt zusätzlich 0 Byte (Leerstring) oder 9 Byte (1 Zeichen) bis 2GB (Userspace-Adressraum-Ende).

Um den benötigten Speicher zu ermitteln könnte man so vorgehen:
Delphi-Quellcode:
Size := List.InstanceSize;
Inc(Size, List.Capacity * 8) // record für jedes Item (Objects[] + Strings[])
for i := 0 to List.Count - 1 do
  if List[i] <> '' then
    Inc(Size, 8 + Length(List[i]));
Das muss aber nicht vollständig sein.

DevilsCamp 18. Feb 2005 12:03

Re: Speicherbedarf von TStringList
 
Zitat:

Zitat von jbg
Zitat:

in der StringList werden immer nur Strings vom Typ String[12] gespeichert...
Das interessiert die StringList nicht. Die hält ihre Daten in einem AnsiString und der ist dynamisch. AnsiString braucht immer 4 Byte (Zeiger) und dann je nach Inhalt zusätzlich 0 Byte (Leerstring) oder 9 Byte (1 Zeichen) bis 2GB (Userspace-Adressraum-Ende).

Das habe ich jetzt nur erwähnt in er Hoffnung, dass evtl. ein entscheidender Hinweis kommt, wie man es besser machen könnte :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz