Autor |
Beitrag |
adler
      
Beiträge: 511
Windows XP
Delphi 05 Pers
|
Verfasst: Mi 14.07.04 17:00
Hallo!
Wie kann ich die größe dieses Arrays in RAM berechnen, es muss nicht Per PC berechnet werden.
Delphi-Quelltext 1: 2: 3: 4: 5:
| TFeld = record y: integer; end; vMap: array of array of TFeld; |
Sagen wir mal, die arrays sind beide [0..2] groß.
Und in y steht nur ein wert von 0-9, also daraus könnte ich eigentlich smallint machen oder?
Aber gut, wie berechne ich das jetzt?
_________________ Wo's nix zu gucken gibt, gibts vielleicht was zu hören.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 14.07.04 17:02
Ein Integer hat 32 Bit also 4 Byte. Den rest solltest du selber ausrechnen können.
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: Mi 14.07.04 17:03
Ist das Feld Rechteckig? Wenn ja dürften das
Delphi-Quelltext 1:
| length(vMap) * (length(vMap[0]) * sizeof(TFeld) + 8) + 8 |
Bytes sein. Kann aber auch sein dass Delphi mehrdimensionale dynamische Arrays irgendwie anders verwaltet.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 14.07.04 17:11
Warum plus 8?
Ist das Feld 4x4 groß und vom Typ Integer hat es im Speicher eine Größe von (4x4)x4=64 Byte.
|
|
adler 
      
Beiträge: 511
Windows XP
Delphi 05 Pers
|
Verfasst: Mi 14.07.04 17:18
Also 4*3*3 Byte hat dann das ganze feld.
Wo kann ich schaun wieviel byte ein string bzw. char hat? Char ist kleiner Oder? dann nehm ich doch den
Ihr könnts mir aber auch gleich schreiben 
_________________ Wo's nix zu gucken gibt, gibts vielleicht was zu hören.
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: Mi 14.07.04 17:29
@Luckie: Weil Delphi noch einen Längen- und Referenzzähler mit jeweils 4 bytes speichert.
@adler: ein char hat 1 byte, ein string hat "length(string) + 8"
|
|
adler 
      
Beiträge: 511
Windows XP
Delphi 05 Pers
|
Verfasst: Mi 14.07.04 18:34
Hi!
Dann wäre es sinnvoller, meinen Integer auch in ein Char zu speichern? 
_________________ Wo's nix zu gucken gibt, gibts vielleicht was zu hören.
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: Mi 14.07.04 18:55
Wennschon als Byte. Das hängt aber immer davon ab einen wie großen Wertebereich du abdecken willst.
Byte: 0..255
Word: 0..65535
DWord: 0..2^32-1
Je nachdem wie deine Felder aussehen empfiehlt sich auch ein "packet record"
|
|
adler 
      
Beiträge: 511
Windows XP
Delphi 05 Pers
|
Verfasst: Mi 14.07.04 18:59
Von 0 bis 9 
_________________ Wo's nix zu gucken gibt, gibts vielleicht was zu hören.
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: Mi 14.07.04 19:07
Dann kannst du ja auch gleich 2 Zeichen pro Byte speichern, wird nur die Geschwindigkeit ein bissl drunter leiden.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 14.07.04 19:11
obbschtkuche hat folgendes geschrieben: | @Luckie: Weil Delphi noch einen Längen- und Referenzzähler mit jeweils 4 bytes speichert. |
Den gibt es aber doch nur bei Strings oder?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); var MyArray: array of array of Integer; len: Integer; begin setlength(MyArray, 4, 4); len := length(MyArray[0]) * length(myArray[1]) * sizeof(Integer); ShowMessage(IntToStr(len)); end; |
Ergebnis 64.
Ein String belegt immer 4 Byte, da es nur ein Zeiger auf eine Asdresse im Speicher ist. Ein Char belegt per Definition immer 1 Byte.
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: Mi 14.07.04 19:40
Natürlich ist das Ergebnis 64, weil du einfach nur die Anzahl der Elemente mit der Größe der Elemente multiplizierst. Allerdings vergisst du die Elemente die man bei einem Integer-Array mit dem Index maxint (bzw. maxint-1) erreichen kann, da sie direkt vor dem ersten Element (falls vorhanden) gespeichert sind.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var x: array of array of integer; i: integer; begin setlength(x, 4, 5); i := PDWord(@x[maxint])^; showmessage('Länge des Arrays: ' + inttostr(i)); i := PDWord(@x[maxint-1])^; showmessage('Referenz-Zähler: ' + inttostr(i));
i := PDWord(@x[0][maxint])^; showmessage('Länge des Arrays: ' + inttostr(i)); i := PDWord(@x[0][maxint-1])^; showmessage('Referenz-Zähler: ' + inttostr(i)); end; |
Und beim String ist es das Selbe
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 15.07.04 12:36
Nicht nur Strings, auch dynamische Arrays haben Längenzähler und Referenzzähler.. der AnsiString ist so gesehen eigentlich nur ein Sonderfall eines dynamischen array of Char...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|