Würde diese Vereinigung funktionieren, wenn char strengere Ausrichtungsanforderungen als int hätte?

8

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:

%Vor%

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.

  1. Ich spreche speziell darüber, was der Standard hier zulässt, nicht was ein vernünftiger Implementator / eine vernünftige Architektur bieten würde.

  2. Ich verwende den Begriff "Byte" im ISO-C-Sinne, wo es die Breite von char ist, nicht unbedingt 8 Bits.

paxdiablo 21.12.2010, 05:23
quelle

2 Antworten

7

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).
  • Gegeben T A[2]; , (char *)&A[1] - (char *)&A[0] ist gleich sizeof A[0] .
  • Daher ist die Ausrichtungsanforderung für T nicht größer als sizeof(T) (tatsächlich teilt sie sizeof(T) )
R.. 21.12.2010, 05:26
quelle
1

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.

    
ysap 21.12.2010 06:07
quelle

Tags und Links