Würde diese Vereinigung arbeiten, wenn das Zeichen als int strengere Ausrichtungsanforderungen hatte?
Frage
Vor kurzem stieß ich auf das folgende Snippet, das ist ein Versuch, alle Bytes von i
(nad nicht mehr) als einzelne Elemente c
zugänglich zu gewährleisten:
union {
int i;
char c[sizeof(int)];
};
Nun scheint dies eine gute Idee, aber ich frage mich, ob der Standard für den Fall erlaubt, in dem die Ausrichtungsanforderungen für char
restriktiver sind als die für int
.
Mit anderen Worten ist es möglich, ein Vier-Byte-int zu haben, die mit einem Ein-Byte-char
auf eine Vier-Byte-Grenze ausgerichtet wird erforderlich ist (es ist ein Byte, per Definition, siehe unten) erforderlich seine ausgerichtet auf einer sechzehn-Byte-Grenze?
Und würde dieses Zeug der Verwendung der Vereinigung oben?
Zwei Dinge zu beachten.
-
Ich spreche speziell über das, was der Standard hier erlaubt, nicht das, was eine vernünftigen Implementierer / Architektur bieten würde.
-
Ich verwende den Begriff "Byte" in der ISO C Sinne, wo es die Breite eines
char
ist, nicht notwendigerweise 8 Bit.
Lösung
No type can ever have stricter alignment requirements than its size (because of how arrays work), and sizeof(char)
is 1.
In case it's not obvious:
sizeof(T [N])
issizeof(T)*N
.sizeof
is in units ofchar
; all types are represented as a fixed number of bytes (char
), that number being their size. See 6.2.6 (Representation of Types) for details.- Given
T A[2];
,(char *)&A[1] - (char *)&A[0]
is equal tosizeof A[0]
. - Therefore the alignment requirement for
T
is no greater thansizeof(T)
(in fact it dividessizeof(T)
)
Andere Tipps
Have a look at this thread. There, I questioned the usefulness of C Unions and there are some interesting insights. The important thing is that the Standard does not ensure the alignment of the different fields at all!
EDIT: paxdiablo, just noticed you were one of the guys answering that question, so you should probably be familiar with this limitation.