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, 44);
  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, 45);
 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...