![]() |
x: String; -> zu Groß
Hy Community,
ich hab mich neulich ein bisschen mit Strings beschäftigt und habe wieder gelesen: Zitat:
Zitat:
Delphi-Quellcode:
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?
s: String[40] //s kann bis zu 40 Zeichen aufnehmen
mfg. Mysterio08 |
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. |
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. |
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. |
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.
|
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 05:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz