AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Länge eines Strings vs. verbrauchter Speicherplatz
Thema durchsuchen
Ansicht
Themen-Optionen

Länge eines Strings vs. verbrauchter Speicherplatz

Ein Thema von martinf16 · begonnen am 14. Sep 2009 · letzter Beitrag vom 15. Sep 2009
Antwort Antwort
Seite 1 von 2  1 2      
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#1

Länge eines Strings vs. verbrauchter Speicherplatz

  Alt 14. Sep 2009, 02:55
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.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Länge eines Strings vs. verbrauchter Speicherplatz

  Alt 14. Sep 2009, 03:14
Speicherplatz wo?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#3

Re: Länge eines Strings vs. verbrauchter Speicherplatz

  Alt 14. Sep 2009, 03:19
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Länge eines Strings vs. verbrauchter Speicherplatz

  Alt 14. Sep 2009, 03:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#5

Re: Länge eines Strings vs. verbrauchter Speicherplatz

  Alt 14. Sep 2009, 03:32
in der Datei befindet sich ja nur der String-Inhalt

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)?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Länge eines Strings vs. verbrauchter Speicherplatz

  Alt 14. Sep 2009, 03:37
Genau, mit length(memo1.text).

Ist das falsch?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#7

Re: Länge eines Strings vs. verbrauchter Speicherplatz

  Alt 14. Sep 2009, 03:53
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.

ich hätte jetzt maximal 2 Byte mehr erwartet (Zeilenumbruch nach der letzen Zeile ... die normale TStringList hat da ein paar kleine Problemchen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Länge eines Strings vs. verbrauchter Speicherplatz

  Alt 14. Sep 2009, 04:05
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#9

Re: Länge eines Strings vs. verbrauchter Speicherplatz

  Alt 14. Sep 2009, 04:11
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Länge eines Strings vs. verbrauchter Speicherplatz

  Alt 14. Sep 2009, 04:19
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???
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:26 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