Kürzlich stieß ich auf das folgende Snippet, das versucht, sicherzustellen, dass alle Bytes von i
(nicht mehr) als einzelne Elemente von c
zugänglich sind:
Nun scheint das eine gute Idee zu sein, aber ich frage mich, ob der Standard den Fall zulässt, dass die Ausrichtungsanforderungen für char
restriktiver sind als für int
.
Mit anderen Worten, ist es möglich, ein Vier-Byte-int zu haben, das an einer Vier-Byte-Grenze mit einem Ein-Byte- char
ausgerichtet werden muss (es ist ein Byte, per Definition, siehe unten) erforderlich auf einer 16-Byte-Grenze ausgerichtet werden?
Und würde das die oben genannte Verbindung ausstopfen?
Zwei Dinge zu beachten.
Ich spreche speziell darüber, was der Standard hier zulässt, nicht was ein vernünftiger Implementator / eine vernünftige Architektur bieten würde.
Ich verwende den Begriff "Byte" im ISO-C-Sinne, wo es die Breite von char
ist, nicht unbedingt 8 Bits.
Kein Typ kann jemals strengere Ausrichtungsanforderungen als seine Größe haben (aufgrund der Funktionsweise von Arrays), und sizeof(char)
ist 1.
Falls es nicht offensichtlich ist:
sizeof(T [N])
ist sizeof(T)*N
. sizeof
ist in Einheiten von char
; Alle Typen werden als feste Anzahl von Bytes ( char
) dargestellt, wobei diese Zahl ihre Größe ist. Details siehe 6.2.6 (Darstellung der Typen). T A[2];
, (char *)&A[1] - (char *)&A[0]
ist gleich sizeof A[0]
. T
nicht größer als sizeof(T)
(tatsächlich teilt sie sizeof(T)
) Sehen Sie sich diesen Thread an. Dort stellte ich die Nützlichkeit von C-Gewerkschaften in Frage und es gibt einige interessante Einsichten. Wichtig ist, dass der Standard die Ausrichtung der verschiedenen Felder überhaupt nicht gewährleistet!
EDIT: paxdiablo, habe gerade bemerkt, dass du einer der Typen bist, die diese Frage beantwortet haben, also solltest du diese Einschränkung wahrscheinlich kennen.