Autor Beitrag
adler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 511

Windows XP
Delphi 05 Pers
BeitragVerfasst: 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.

ausblenden 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



BeitragVerfasst: 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



BeitragVerfasst: Mi 14.07.04 17:03 
Ist das Feld Rechteckig? Wenn ja dürften das

ausblenden 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 511

Windows XP
Delphi 05 Pers
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 511

Windows XP
Delphi 05 Pers
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 511

Windows XP
Delphi 05 Pers
BeitragVerfasst: 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



BeitragVerfasst: 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



BeitragVerfasst: 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?
ausblenden 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.
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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!