Autor |
Beitrag |
Biarchiv
      
Beiträge: 688
|
Verfasst: Mi 18.01.06 22:13
Hallo,
gibt es eine Tabelle wo man den Speicherverbrauch von
string, intereger, int64, shortstring,...
sehen kann.
Kann da man sich viel sparen, wenn man statt String einen Shortstring verwendet wenn nicht wirklich ein String gebraucht wird?
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mi 18.01.06 22:21
Den Speicherverbrauch der einzelnen Typen findest Du in der Delphi-Hilfe im Dokument "Datentypen". Integer und dergleichen sind dabei fest vorgegeben, Strings nicht.
Das erste Zeichen des Strings (Index 0) ist ja die Größe des Strings. Das Problem an der Sache ist dann, wenn Du den String verlängerst, muss der komplette String IMHO an eine neue Stelle kopiert werden, damit er gleich größer erstellt werden kann. Da hat ShortString den Vorteil, dass dieser Typ von vornherein festgelegt ist und glaube nur 255 Zeichen lang sein kann.
Speicher spart man sich also keinen, es kommt eher auf die Performance an.
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Mi 18.01.06 22:27
Es kommt darauf an wieviele Strings du anlegen willst  . Ein ShortString belegt maximal 256 Bytes. Ein Integer 4 Bytes. Int64 8 Bytes.
Zitat: | Kann da man sich viel sparen, wenn man statt String einen Shortstring verwendet wenn nicht wirklich ein String gebraucht wird? |
Es kommt darauf an welche Delphversion verwndet wird. Früher konnten Strings nur max. 255 Zeichen lang sein ( Belegung 256 Bytes ; 255 + Längebyte). Bei den neuern Delphivarianten wurde diese Beschränkung entfernt, nun ist der Standard-"Stringtyp" AnsiString. Ein "alter" String heißt nun ShortString.
_________________ Markus Kinzler.
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Mi 18.01.06 22:39
Dazu Auszug aus Delphi-Referenz:
Zitat: |
Kurze String-Typen
Ein ShortString hat eine Länge von 0 bis 255 Zeichen. Obwohl sich seine Länge dynamisch ändern kann, beträgt die statische Speicherplatzzuweisung immer 256 Bytes. Im ersten Byte wird die Länge des Strings gespeichert, die restlichen 255 Byte stehen für die Zeichen zur Verfügung. Wenn S eine ShortString-Variable ist, gibt Ord(S[0]) die Länge von S zurück (dasselbe Ergebnis erzielen Sie mit Length(S)). Durch Zuweisung eines Wertes an S[0] können Sie (wie durch einen Aufruf von SetLength) die Länge von S ändern. ShortString wird nur aus Gründen der Abwärtskompatibilität mitgeführt.
Delphi unterstützt kurze String-Typen (Untertypen von ShortString), deren maximale Länge zwischen 0 und 255 Zeichen liegen kann. Diese Typen werden mit einer Zahl in eckigen Klammern dargestellt, die auf das reservierte Wort string folgt. Zum Beispiel:
var MyString: string[100];
Hier wird die Variable MyString mit einer maximalen Länge von 100 Zeichen erstellt. Die folgenden Deklarationen sind mit der obigen Zeile identisch:
type CString = string[100];
var MyString: CString;
Bei Variablen, die auf diese Weise deklariert werden, wird dem Typ nur so viel Speicherplatz zugewiesen, wie für die angegeben Länge plus ein Byte erforderlich ist. Im obigen Beispiel belegt MyString 101 Byte. Für eine Variable des vordefinierten Typs ShortString wären dagegen 256 Byte erforderlich.
Bei einer Wertzuweisung an eine kurze String-Variable wird der String abgeschnitten, wenn die maximale Länge für den Typ überschritten wird.
Die Standardfunktionen High und Low bearbeiten Variablen und Typbezeichner für kurze Strings. High liefert die maximale Länge des kurzen String-Typs, während Low Null zurückgibt.
Lange String-Typen
Der Typ AnsiString (auch als langer String bezeichnet) stellt einen dynamisch zugewiesenen String dar, dessen maximale Länge nur durch den verfügbaren Speicherplatz begrenzt wird.
Eine AnsiString-Variable ist ein Zeiger, der vier Byte Speicherplatz belegt. Wenn die Variable leer ist (also einen String der Länge Null enthält), hat der Zeiger den Wert nil, und der String belegt keinen Speicherplatz. Ist die Variable nicht leer, zeigt sie auf einen dynamisch zugewiesenen Speicherblock, der einen String-Wert enthält. Die acht Byte vor der Stelle enthalten eine Längenangabe und einen Referenzzähler von je 32 Bit. Da dieser Speicherplatz auf dem Heap reserviert und vollkommen automatisch verwaltet wird, erfordert er keinerlei Benutzercode.
Da es sich bei AnsiString-Variablen um Zeiger handelt, können zwei oder mehrere dieser Variablen auf denselben Wert zeigen, ohne zusätzlichen Speicherplatz zu belegen. Der Compiler nützt dies zur Einsparung von Ressourcen. Auch Zuweisungen werden schneller ausgeführt. Sobald eine AnsiString-Variable freigegeben oder mit einem neuen Wert belegt wird, wird der Referenzzähler des alten Strings (d.h. des vorhergehenden Wertes der Variablen) erniedrigt und der Referenzzähler des neuen Wertes (falls ein solcher zugewiesen wurde) erhöht. Erreicht der Referenzzähler eines Strings den Wert Null, wird der belegte Speicherplatz freigegeben. Dieser Vorgang wird als Referenzzählung bezeichnet. Wenn der Wert eines einzelnen Zeichens im String über einen Index geändert werden soll, wird eine Kopie des Strings angelegt. Dies ist aber nur möglich, wenn der betreffende Referenzzähler größer als 1 ist. Diesen Vorgang nennt man Copy-on-Write-Semantik.
|
Also kann deine Frage Zitat: | Kann da man sich viel sparen, wenn man statt String einen Shortstring verwendet wenn nicht wirklich ein String gebraucht wird? |
wie folgt beantwortet werden:
Nein im Gegenteil ShortStrings belegen immer 256 bytes, währrend AnsiStrings nur soviel belegen wie sie lang sind ( +4 Bytes Zeiger).
_________________ Markus Kinzler.
|
|
|