Entwickler-Ecke
Sonstiges (Delphi) - Bytegröße meines arrays im RAM berechnen?
adler - Mi 14.07.04 17:00
Titel: Bytegröße meines arrays im RAM berechnen?
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?
Delete - Mi 14.07.04 17:02
Ein Integer hat 32 Bit also 4 Byte. Den rest solltest du selber ausrechnen können.
Anonymous - 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.
Delete - 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 - 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 ;)
Anonymous - 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 - Mi 14.07.04 18:34
Hi!
Dann wäre es sinnvoller, meinen Integer auch in ein Char zu speichern? ;)
Anonymous - 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 - Mi 14.07.04 18:59
Von 0 bis 9 ;)
Anonymous - 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.
Delete - 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.
Anonymous - 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 - 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...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!