Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - packed record


sk0r - So 10.08.08 13:10
Titel: packed record
Also, was bringt denn nun ein packed record eigentlich?

Wenn ich in einem Record zwei Integer-Member deklariert habe und sie größe mit sizeof
ausgebe, dann ist mit und ohne das packed Schlüsselwort der Record 8 Bytes groß.


mkinzler - So 10.08.08 13:21

Dann mach mal sus einem Integer ein Word


sk0r - So 10.08.08 13:33

Ja, das hat nichts gebracht.


GTA-Place - So 10.08.08 13:40


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  Test1 = record
    A: Word;
    B: String;
    C: Char;
  end;

  Test2 = packed record
    A: Word;
    B: String;
    C: Char;
  end;


Nimm das und freue dich über 5 Byte Ersparnis :)


Hidden - So 10.08.08 13:47

Zur eigentlichen Frage: Was wird denn genau anders gemacht? Bringt es immer/nur Vorteile? Warum ist packed nicht der Standard-Record?


Chryzler - So 10.08.08 14:07

Bei einem "normalen" record werden die einzelnen Member so im Speicher ausgerichtet, dass sie immer an einer Speicherstelle stehen, die durch 4 teilbar ist. Dadurch wird der Zugriff darauf optimiert, allerdings entstehen dadurch eventuell Lücken bis zu 3 Bytes jeweils. Beim packed record werden alle Member so dicht wie möglich aneinander geschoben, allerdings ist dann der Zugriff auf manche Member geringfügig langsamer. So habs ich verstanden. :)


mkinzler - So 10.08.08 14:09

Wobei man das Alignment einstellen kann


sk0r - So 10.08.08 14:24


Delphi-Quelltext
1:
2:
3:
4:
type Test1 = packed record
    A: Word;
    C: Char;
  end;


ergibt packed 3 und unpacked 4.


Hidden - So 10.08.08 15:57

Also ist packed auf speicherplatz optimiert und normal auf Laufzeit, danke :think:


Delete - So 10.08.08 17:05

Kann man so nicht sagen. Packed stellt auch sicher, dass der Record noch gelesen werden kann, wenn ein anderes Alignment verwendet wird.