Würde diese Vereinigung arbeiten, wenn das Zeichen als int strengere Ausrichtungsanforderungen hatte?

StackOverflow https://stackoverflow.com/questions/4496514

  •  12-10-2019
  •  | 
  •  

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.

  1. Ich spreche speziell über das, was der Standard hier erlaubt, nicht das, was eine vernünftigen Implementierer / Architektur bieten würde.

  2. Ich verwende den Begriff "Byte" in der ISO C Sinne, wo es die Breite eines char ist, nicht notwendigerweise 8 Bit.

War es hilfreich?

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]) is sizeof(T)*N.
  • sizeof is in units of char; 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 to sizeof A[0].
  • Therefore the alignment requirement for T is no greater than sizeof(T) (in fact it divides sizeof(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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top