AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

x: String; -> zu Groß

Ein Thema von Mysterio08 · begonnen am 23. Mai 2009 · letzter Beitrag vom 23. Mai 2009
Antwort Antwort
Mysterio08

Registriert seit: 11. Jan 2009
142 Beiträge
 
#1

x: String; -> zu Groß

  Alt 23. Mai 2009, 09:08
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:

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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: x: String; -> zu Groß

  Alt 23. Mai 2009, 09:12
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Dunkel
Dunkel

Registriert seit: 26. Mär 2007
Ort: Klingenstadt
541 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: x: String; -> zu Groß

  Alt 23. Mai 2009, 09:43
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.
Es ist zu wahr um schön zu sein...
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#4

Re: x: String; -> zu Groß

  Alt 23. Mai 2009, 09:54
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: x: String; -> zu Groß

  Alt 23. Mai 2009, 09:56
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: x: String; -> zu Groß

  Alt 23. Mai 2009, 10:00
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 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