| J.Borchert hat folgendes geschrieben: |
| Ich weiß aber immer noch nicht so richtig, was es mit dem packed auf sich hat. |
Die x86er-Architektur hat 32 Bit breite Register. Dein Prozessor kann also am schnellsten 32Bit auf einmal verarbeiten.
Daher richtet Delphi einen Record automatisch an diese Breite aus.
Wenn du
Delphi-Quelltext
1: 2: 3: 4:
| blah = record blah: Byte blah: LongWord end; |
schreibst, ist dein Record nicht, wie eigentlich zu vermuten, 5 Byte lang, groß, sondern 8. 32 Bit für den LongWord und 32 Bit für den Byte, obwohl dieser nur 8 Bit lang ist. die restlichen 24 Bit sind Nullen.
Du hattest durch dein array[1..6] 6 Byte (32+16=48 Bit) und durch den Double nochmal 8. Delphi lässt jetzt zwischen dem Array und dem Double 16 Bit frei, damit er das Array in zwei Registern und den Double in zwei Registern unterbringen kann, ohne die Daten auseinanderzupfriemeln. Durch das packed record wird der Programmablauf also langsamer, man sollte also falls möglich immer auf das record verzichten.
Manchmal kommt man aber nicht um ein packed umher, insbesondere wenn man mit einer API zu tun hat, die in C geschrieben wurde, so erwartet z.B. Windows in der Regel immer packed records.
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk.