Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Länge eines Strings vs. verbrauchter Speicherplatz (https://www.delphipraxis.net/140226-laenge-eines-strings-vs-verbrauchter-speicherplatz.html)

martinf16 14. Sep 2009 02:55


Länge eines Strings vs. verbrauchter Speicherplatz
 
Ich habe mal eine allgemeine Frage zu Strings und dem Speichern von Strings:

Wenn ich einen String habe und dessen Länge mit length() bestimme, komme ich auf einen anderen Wert als dieser String später als Speicherplatz benötigt. Wie kann das sein?

Eigentlich müsste die Länge des Strings der Anzahl von Bytes entsprechen - aber der verwendete Speicher ist immer etwas größer.

Medium 14. Sep 2009 03:14

Re: Länge eines Strings vs. verbrauchter Speicherplatz
 
Speicherplatz wo?

himitsu 14. Sep 2009 03:19

Re: Länge eines Strings vs. verbrauchter Speicherplatz
 
Zitat:

length() bestimme, komme ich auf einen anderen Wert als dieser String später als Speicherplatz benötigt
Wie hast du denn diesen Speicherverbrauch bestimmt?



Es kommt erstmal auf die Delphi-Version an.
Ab Delphi 2009 ist jedes Zeichen 2 Byte lang ... eben Unicode

Bei Length('') sind grundsätzlich alle Strings 4 Byte, da sie nur aus dem internen NIL-Pointer bestehen. (abgesehn vom ShortString)

ShortString = 256 Byte = 1 LängenByte + 255 Zeichen
String[x] = x+1 Byte = 1 LängenByte + x Zeichen
String = SizeOf(Pointer) + 2 * SizeOf(Integer) + (Length(S) + 1) * SizeOf(Char)
AnsiString = SizeOf(Pointer) + 2 * SizeOf(Integer) + (Length(S) + 1) * SizeOf(AnsiChar)
UnicodeString = SizeOf(Pointer) + 2 * SizeOf(Integer) + (Length(S) + 1) * SizeOf(WideChar)
WideString = SizeOf(Pointer) + 1 * SizeOf(Integer) + (Length(S) + 1) * SizeOf(WideChar)

Ansi-/UnicodeString = internerZeiger + LängenAngabe + Referenzzähler + (Länge + abschließende#0) * Zeichengröße


Dazu kommt dann noch die Defragmentierung des jeweiligen SpeicherManagers und dessen Verwaltungsdaten
(der WideString wird von der OLE32 verwaltet ... z.B. SysAllocStringLen aus OleAut32.dll)

martinf16 14. Sep 2009 03:24

Re: Länge eines Strings vs. verbrauchter Speicherplatz
 
Speicherplatz meint wenn der String als Textdatei abgespeichert wird.

Also zum Beispiel: String im Memo (x Zeichen) -> SaveAsFile -> Datei.txt (x Bytes)

@himitsu:
Die Strings werden nicht als Unicode abgespeichert.
Bestimmt habe ich den Speicherbedarf dann im Explorer über die Dateiinformationen.
Ich schau mal ob ich mit deinen Formeln die Berechnung hinbekomme..

Ähm, wie bestimme ich denn SizeOf(Pointer) und SizeOf(Integer) wenn der Text einfach nur in einem Memo vorliegt? Also zum Beispiel wenn ein Benutzer einen Text eingeben kann und dann eine Vorschau angegeben wird, wie viel dieser Text an Speicher verbrauchen wird.

himitsu 14. Sep 2009 03:32

Re: Länge eines Strings vs. verbrauchter Speicherplatz
 
in der Datei befindet sich ja nur der String-Inhalt

Zitat:

Zitat von martinf16
Speicherplatz meint wenn der String als Textdatei abgespeichert wird.

Also zum Beispiel: String im Memo (x Zeichen) -> SaveAsFile -> Datei.txt (x Bytes)

OK, dann mal andersrum wie genau hast dann die Länge des/der Strings im Memo bestimmt?

Length(Memo.Text)?

martinf16 14. Sep 2009 03:37

Re: Länge eines Strings vs. verbrauchter Speicherplatz
 
Genau, mit length(memo1.text).

Ist das falsch?

himitsu 14. Sep 2009 03:53

Re: Länge eines Strings vs. verbrauchter Speicherplatz
 
Delphi-Quellcode:
Memo1.Lines.SaveToFile('a.txt');
Label1.Caption := IntToStr(Length(Memo1.Text));
Also bei mir stimmen Dateigröße und der Wert im Label überein. :gruebel:

ich hätte jetzt maximal 2 Byte mehr erwartet (Zeilenumbruch nach der letzen Zeile ... die normale TStringList hat da ein paar kleine Problemchen)

martinf16 14. Sep 2009 04:05

Re: Länge eines Strings vs. verbrauchter Speicherplatz
 
Oh.. Das stimmt bei mir auch überein, wie ich gerade bemerkt habe. Offenbar passiert der Fehler beim Laden der Datei.
Also wenn ich eine Datei zum Beispiel mit dem Editor erstellt habe, diese lade und dann wieder abspeichere, ändert sich die Größe. Zum Laden verwende ich folgende Funktion:

Delphi-Quellcode:
try
  AssignFile(Datei, 'dateiname');
  Reset(Datei, 1);
  repeat
    BlockRead(Datei, Buffer, SizeOf(Buffer), NumRead);  //Buffer ist array[1..1024] of Char
    temp:=temp+Buffer;
  until
    (NumRead < SizeOf(Buffer));
finally
  CloseFile(Datei);
end;

result:=temp;
Ich hatte nicht gedacht, dass der Fehler beim Laden passiert, da die Datei im Programm richtig angezeigt wird. Mache ich da irgendetwas falsch?

himitsu 14. Sep 2009 04:11

Re: Länge eines Strings vs. verbrauchter Speicherplatz
 
Unterschiedliche Zeilenumbrüche

Das Memo verwendet die #13#10 (Windows), wärend einige Editoren nur eine #10 (Linux) speichern,
dabei wird dieses beim Einlesen umgewandelt.

martinf16 14. Sep 2009 04:19

Re: Länge eines Strings vs. verbrauchter Speicherplatz
 
Ok, Danke. Daran kann es liegen. Und die Prozedur zum Einlesen birgt nicht irgendwelche andere Fehlerquellen?

Wenn ich nämlich die Datei immer wieder lade und speichere wird sie bei jedem mal größer.. Das dürfte ja auch nicht sein.

Edit: Ich hab den Fehler. Die Funktion zum Laden der Datei scheint zu viel zu laden, am Ende befinden sich immer noch Stellen von anderen Dateien. Kann jemand sagen was daran falsch ist???


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr.
Seite 1 von 2  1 2      

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