Bit orientierter Record C vs. Pascal

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

Bit orientierter Record C vs. Pascal

Beitrag von Mathias »

In C hatte ich solche eine Vorlage, die spuckt mit 5, 8, 12 aus. Es wird auf einen ganzen 32Bit Wert gerundet.

Code: Alles auswählen

// gcc main.c -o main
#include <stdio.h>

struct Test1 {
  int b1:1;
  int b2:1;
  int b3:1;
};

struct Test2 {
  int a;
  int b1:1;
  int b2:1;
  int b3:1;
};

struct Test3 {
  int a;
  int b1:1;
  int b2:1;
  int b3:1;
  int b;
};

int main(int argc, char *argv[]) {
  struct Test1 test1;
  printf("size: %li\n", sizeof(test1));  // -> size: 4
  struct Test2 test2;
  printf("size: %li\n", sizeof(test2));  // -> size: 8
  struct Test3 test3;
  printf("size: %li\n", sizeof(test3));  // -> size: 12
}
So nun dasselbe mit Pascal.
Nun das komisch, woher kommt die 3 beim ersten Record ?

Code: Alles auswählen

program Project1;

type
  TTest1 = record
    b1: 0..1;
    b2: 0..1;
    b3: 0..1;
  end;

  TTest2 = record
    a: integer;
    b1: 0..1;
    b2: 0..1;
    b3: 0..1;
  end;

  TTest3 = record
    a: integer;
    b1: 0..1;
    b2: 0..1;
    b3: 0..1;
    b: integer;
  end;

var
  test1: TTest1;
  test2: TTest2;
  test3: TTest3;
begin
  WriteLn('size: ', SizeOf(test1)); // -> size: 3
  WriteLn('size: ', SizeOf(test2)); // -> size: 8
  WriteLn('size: ', SizeOf(test3)); // -> size: 12
end.
Mache ich überall einen "packed record", dann bekomme ich 3, 7 , 11. Da wird alles nach einen Byte ausgerichtet.
Bei "bitpacked record": 1, 5, 9.
Dies würde alles stimmen, ausser wie erwähnt, die 3 beim ersten Beispiel.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 966
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Bit orientierter Record C vs. Pascal

Beitrag von PascalDragon »

Mathias hat geschrieben: Sa 10. Aug 2024, 08:30 So nun dasselbe mit Pascal.
Nun das komisch, woher kommt die 3 beim ersten Record ?
Was soll daran komisch sein? Ohne bitpacked ist die Minimalgröße einer Variable 1 Byte. Du hast drei Felder, ergo 3 Byte.
FPC Compiler Entwickler

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

Re: Bit orientierter Record C vs. Pascal

Beitrag von Mathias »

Müsste dann der 2 Record nicht 7 sein ?
4 und 3 gibt 7.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 966
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Bit orientierter Record C vs. Pascal

Beitrag von PascalDragon »

Mathias hat geschrieben: So 11. Aug 2024, 20:53 Müsste dann der 2 Record nicht 7 sein ?
4 und 3 gibt 7.
Der Compiler fügt am Ende ein Padding-Byte ein.
FPC Compiler Entwickler

Benutzeravatar
kupferstecher
Beiträge: 436
Registriert: Do 17. Nov 2016, 11:52

Re: Bit orientierter Record C vs. Pascal

Beitrag von kupferstecher »

Der Compiler gruppiert ja die Variaben, sonst würde b1 bis b3 jeweils 4 Byte brauchen. Ich würde vermuten, dass das Pading-Byte im zweiten Fall von der Gruppierung kommt, wie wenn diese selbst zu einem record zusammengefasst worden wären. Bei drei gleichen Typen ohne andern Typ im Record scheint die Gruppierung nicht stattzufinden. Interessant wäre vielleicht ein Versuch mit 5 gleichen Typen b1 bis b5, ob Sizeof dann 5 oder 8 Byte ausgibt.

Aber letztlich sind das doch alles Comiler-Internas, die einen nicht zu interessieren brauchen. Braucht man eine bestimmte Anordnung und verlässliche Größe, dann muss man sowieso PACKED verwenden.

Antworten