Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   x: String; -> zu Groß (https://www.delphipraxis.net/134493-x-string%3B-zu-gross.html)

Mysterio08 23. Mai 2009 09:08


x: String; -> zu Groß
 
Hy Community,
ich hab mich neulich ein bisschen mit Strings beschäftigt und habe wieder gelesen:
Zitat:

Wenn ein Speicherplatz vom Typ String angefordert wird, wird ein 32Bit Speicherplatz reserviert, der bis zu 2 Milliarden Zeichen aufnehmen kann
und weiter
Zitat:

Im Falle eines Speicherplatz vom Typ ShortString stellt Delphi 256Byte bereit.
Da sind natürlich riesen Unterschieden zwischen "praktisch unbegrenzt" (ich hab errechnet: bei einem Roman mit 60 Zeichen pro Zeile und 35 Zeilen entsrpäche das mehr als 900.000 Buchseiten) und 255 Zeichen und so kann man, wie allen bekannt sein dürfte einen String auch so deklarieren:

Delphi-Quellcode:
s: String[40] //s kann bis zu 40 Zeichen aufnehmen
Nun meine Frage: Wenn ich eine Variable so deklariere, dann reserviere ich mir doch nicht auch einen 32Bit Speicherplatz, oder? Oder ist Delphi so "intelligent", dass es den Speicherplatz errechnet?

mfg. Mysterio08

mkinzler 23. Mai 2009 09:12

Re: x: String; -> zu Groß
 
Nein, das ist ein ShortString.

Delphi besitzt bis (d2007) 2 Stringtypen
ShortString: bis 255 Zeichen, die Länge steht an Position 0.
AnsiString: 32Bit-Zeiger
Delphi entscheidet welchen der beiden er bei Angabe string verwendet.
Ab d2009 gibt es dann noch ein UnicodeString, der als Standard verwendet wird.

Dunkel 23. Mai 2009 09:43

Re: x: String; -> zu Groß
 
Der "32 Bit Speicherplatz" wird auf jeden Fall reserviert und benötigt; das ist nur der Zeiger auf den Speicerbereich, wo sich dann die Daten (der String) befindet.
Dass eine String-Variable 2 Milliarden Zeichen speichern kann, bedeutet noch lange nicht, dass der Speicher sofort reserviert wird; dieser wird dynamisch, nach bedarf, alloziert. Du kannst also ruhigen Gewissens, auch für nur 2 Zeichen, eine String-Variable benutzen.

Phoenix 23. Mai 2009 09:54

Re: x: String; -> zu Groß
 
Der 32 bit Speicherplatz sind wie gesagt 32bit, also genau 4 byte. Mehr nicht ;-)
Dazu kommt eben bis Delphi 2007 noch 1 Byte pro Zeichen in dem String. Ab Delphi 2009 ist das ggf. ein wenig mehr, weil dort dann ja Unicode-Daten abgelegt werden. In jedem Fall brauchst Du Dir aber über den Platz den ein String im Speicher tatsächlich benötigt eigentlich keine Sorgen zu machen.

Apollonius 23. Mai 2009 09:56

Re: x: String; -> zu Groß
 
Ein ShortString wie zum Beispiel String[40] hat den Nachteil, dass der Speicherplatz sofort benötigt wird. Wenn du also im Netzwerk immer String[255] verschickst, werden unabhängig vom tatsächlichen Inhalt immer 256 Byte (Inhalt + Längenbyte) verschickt. Das kann ziemlich ineffizient sein. Selbiges gilt für das Speichern in Dateien.

mkinzler 23. Mai 2009 10:00

Re: x: String; -> zu Groß
 
Auf der anderen Seite sind AnsiString/UnicodeString nicht finalisierbar. D.h. das deren Verwendung in Datenstrukturen (Records) dazu führt, dass die Datensätze der Struktur keine fixe Länge mehr haben. Z.B. kann man dann davon keine typisierten Dateien mehr erzeugen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 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