{$PackRecords ?}

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

{$PackRecords ?}

Beitrag von Mathias »

Egal was ich bei $PackRecords reinschreibe, ob es 1, 2, 4 ,8 ,16, 32 ist, SizeOf gibt immer "3" aus.
Ausser wen ich eine Zahl nehme, die nicht in der 2er-Potenz ist, kommt eine Fehlermeldung oder ab 64.

Code: Alles auswählen

{$PackRecords 4}
type
  Trec2 = record
    a: byte;
    b: byte;
    c: byte;
  end;
 
begin
  WriteLn(SizeOf(Trec2));
end.

Wieso hat der Wert bei $PackRecords keinen Einfluss ?
FPC 3.0.4 Linux 64Bit.

Bei Win32 das Gleiche.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: {$PackRecords ?}

Beitrag von Soner »

Es zählt einfach Bytes von Record-Daten. Wenn du ein "d:byte" hinzufügst, dann gibt sizeof 4 aus, bei noch ein "e:byte" wird daraus 5. Ist ja klar 5 Byte.
$packrecords hat überhaupt keinen Einfluß aus der Erklärung https://www.freepascal.org/docs-html/3.0.0/prog/progsu60.html werde ich nicht schlau. Es scheint mir Bug zu sein.

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: {$PackRecords ?}

Beitrag von indianer-frank »

Soner hat geschrieben:$packrecords hat überhaupt keinen Einfluß aus der Erklärung https://www.freepascal.org/docs-html/3.0.0/prog/progsu60.html werde ich nicht schlau. Es scheint mir Bug zu sein.

"This means that the elements of a record which have size greater than n will be aligned on n byte boundaries."

Ist doch einfach: da sizeof(Byte)=1 ist, und dies nicht größer als 1,2,.. ist, werden Bytes nicht nicht aligned. Wenn man den Link als Spezifikation ansehen kann, ist es also kein Bug.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: {$PackRecords ?}

Beitrag von Mathias »

Dazumal hatte dies noch funktioniert: http://www.lazarusforum.de/viewtopic.php?f=10&t=9131&p=80869&hilit=PackRecords#p80869

Ich werde mal eine Bug-report schreiben.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: {$PackRecords ?}

Beitrag von indianer-frank »

Mathias hat geschrieben:Dazumal hatte dies noch funktioniert: http://www.lazarusforum.de/viewtopic.php?f=10&t=9131&p=80869&hilit=PackRecords#p80869

Ich werde mal eine Bug-report schreiben.

Langsam! Dort sind im Record ja auch andere Typen (double, longint...). Und Record-Felder mit sizeof(..) > 1 werden aligned.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: {$PackRecords ?}

Beitrag von Mathias »

Dies müsste eigentlich 64 ausgeben und nicht 48. :roll:
4x16 gibt 64.

Code: Alles auswählen

type
  tvec3 = array[0..2] of single;
 
  {$PackRecords 16}
type
  Trec2 = record
    v0: tvec3;
    v1: tvec3;
    v2: tvec3;
    v3: tvec3;
  end
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Horst_h
Beiträge: 72
Registriert: Mi 20. Mär 2013, 08:57

Re: {$PackRecords ?}

Beitrag von Horst_h »

Hallo,

Das funktioniert nur bei unterschiedlichen Größen im record.
Wenn alle gleich sind, macht es weniger Sinn.Byte/word/integer liegen ab dem aligned Start immer auf passenden Grenzen/Adressen.

Code: Alles auswählen

 
{$PackRecords 1}
type
  Trec1 = record
    a: byte;
    b: longint;
  end;
{$PackRecords 2}
type
  Trec2 = record
    a: byte;
    b: longint;
  end;
{$PackRecords 4}
type
  Trec3 = record
    a: byte;
    b: longint;
  end;
 
begin
  WriteLn(SizeOf(Trec1));
  WriteLn(SizeOf(Trec2));
  WriteLn(SizeOf(Trec3));
end.
[/laz]
 
Ausgabe
[code] 
5
6
8
 


Gruß Horst

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: {$PackRecords ?}

Beitrag von indianer-frank »

Mathias hat geschrieben:Dies müsste eigentlich 64 ausgeben und nicht 48. :roll:
4x16 gibt 64.

Wieder der gleiche Fehler: sizeof(tvec3)=12 und das ist kleiner als 16. Also Größe = 4*12 = 48.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: {$PackRecords ?}

Beitrag von Mathias »

Ein 2. Byte müsste gleich behandelt werden, wie ein Integer an 2. Stelle.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten