packed array, Grösse ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

packed array, Grösse ?

Beitrag von Mathias »

Wieso ist bei folgenden Beispiel a1 und a2 gleich gross ?

Ich dachte immer, das ein ganzer 32bit Wert für ein Byte reserviert wird, bei einem 32Bit Betriebssystem.

Code: Alles auswählen

program Project1;
 
type
  a1 = array[0..$FFFF] of byte;
  a2 = packed array[0..$FFFF] of byte;
  a3 = array[0..$FFFF] of boolean;
  a4 = bitpacked array[0..$FFFF] of Boolean;
  a5 = bitpacked array[0..$FF] of Boolean;
 
begin
  Writeln(SizeOf(a1));
  Writeln(SizeOf(a2));
  Writeln(SizeOf(a3));
  Writeln(SizeOf(a4));
  Writeln(SizeOf(a5));
  readln;
end.
 
Ausgabe:

Code: Alles auswählen

65536
65536
65536
8192
32
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: packed array, Grösse ?

Beitrag von theo »

Mathias hat geschrieben: Ich dachte immer, das ein ganzer 32bit Wert für ein Byte reserviert wird, bei einem 32Bit Betriebssystem.
Soweit ich weiss, ist nicht defniert, wie ein nicht gepacktes Array im Speicher liegt.
D.h. Es ist Sache des Compilers, wahrsch. plattformabhängig und man sollte sich auf keine Annahmen darüber verlassen.

Vllt. findest du hier noch was: ftp://ftp.freepascal.org/pub/fpc/docs-pdf/ref.pdf

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: packed array, Grösse ?

Beitrag von Socke »

Mathias hat geschrieben:Ich dachte immer, das ein ganzer 32bit Wert für ein Byte reserviert wird, bei einem 32Bit Betriebssystem.
Für eine Variable von einem Byte große wird nur dann 32 Bit benötigt, wenn die 3 restlichen Bytes nicht mit passenden Variablen von maximal 3 Byte Größe belegt werden können. Bei einem array of Byte werden diese einfach nur aneinander gereiht, da wird kein Platz verschwendet, der gepackt werden kann.

Ich denke, dass records die Sache besser verdeutlichen:

Code: Alles auswählen

program Project1;
 
type
ta = record
  x: byte;   // An 32 Bit ausgerichtet
  y: ptrint; // 32 bit - muss nicht ausgerichtet werden, da x bereits ausgerichtet
  z: byte;   // nochmals an 32 Bit ausgerichtet
end;
tap = packed record  // hier ist nichts ausgerichtet
  x: byte;
  y: ptrint;
  z: byte;
end;
 
tb = record
  x: byte;  // An 32 Bit ausgerichtet
  z: byte;  // passt ebenfalls hinein
  y: ptrint;// wieder 32 Bit
end;
tbp = packed record  // hier ist nichts ausgerichtet
  x: byte;
  z: byte;
  y: ptrint;
end;
 
begin
  WriteLn(Sizeof(ta));  // 12 Byte
  WriteLn(Sizeof(tap)); //  6 Byte
  WriteLn(sizeof(tb));  //  8 Byte
  WriteLn(sizeof(tbp)); //  6 Byte
  readln;
end.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten