Peter II schrieb:
>> Letzte Frage: Ist es richtig, dass ich mich nicht darauf verlassen kann,
>> dass oben genannte Struktur fein säuberlich hintereinander im Speicher
>> liegt?
> wie soll das gehen, wie sie nicht hintereinander im Speicher liegt, dann
> könnte man ja auch nicht darauf zugreifen?
Das Stichwort lautet hier Alignment. Aus Optimierungs- und
Architekturgründen kann sehr wohl zwischen den einzelnen
Strukturelementen etwas Platz gelassen werden, damit mit an von der
Prozessorarchitektur bevorzugten Adressgrenzen ausgerichteten Zugriffen
gearbeitet werden kann.
Nehmen wir mal ein 32-Bit-System und folgende Struktur an:
1 | struct bla
|
2 | {
|
3 | uint8_t wert1;
|
4 | uint32_t wert2;
|
5 | }
|
Wird die Struktur selbst an einer für 32-Bit-Zugriffen geeigneten
Adresse (also einer restlos durch 4 teilbaren) ausgerichtet, läge das
Strukturelement wert2 um eins "daneben".
Etliche 32-Bit-Systeme können hier keinen 32-Bit-Zugriff ausführen,
sondern müssen aufwendig mit Einzelbyte-Zugriffen arbeiten, so daß die
Performance hier massiv leidet.
Deswegen werden hier drei Füllbytes eingeschoben, so daß ein sizeof
der Struktur den Wert 8 und nicht, wie erwartet, 5 zurückgibt.
Mit compilerspezifischen Anweisungen à la #pragma pack oder _packed_
(näheres siehe des Compilers Dokumentation) lässt sich die "langsame"
Variante erzwingen.