Ostatnio natknąłem się na następującym fragmencie, który jest próbą zapewnienia wszystkich bajtów i
(NAD nie więcej) są dostępne jako pojedyncze elementy c
:Czy ten związek działałby, gdyby char miał bardziej rygorystyczne wymagania dopasowania niż int?
union {
int i;
char c[sizeof(int)];
};
Teraz wydaje się to dobrym pomysłem, ale zastanawiam się, jeżeli standard dopuszcza przypadek, w którym wymagania dotyczące wyrównania dla char
są bardziej restrykcyjne niż dla int
.
Innymi słowy, czy możliwe jest czterobajtowe int, które musi być wyrównane na granicy czterech bajtów z jednobajtowym char
(jest to jeden bajt, z definicji, patrz poniżej) wymagane do być wyrównane do szesnastobajtowej granicy?
Czy to podniosłoby użycie związku powyżej?
Dwie rzeczy do zapamiętania.
Mówię konkretnie o tym, na co pozwala tutaj standard, a nie o tym, co zapewni rozsądny implementator/architektura.
Używam terminu "bajt" w sensie ISO C, gdzie jest to szerokość
char
, niekoniecznie 8 bitów.
Będziesz musiał zacytować ISO, aby mnie przekonać na tym, R. Jaka szczególna cecha tablic nie zadziałałaby, gdybyś automatycznie skalował "a [i]" i "a + i", używając raczej wyrównania niż Rozmiar? – paxdiablo
@paxdiablo: To nie zadziałałoby. '(void *) a + i * sizeof (* a)' –
@ sharth - To i tak nie działa - arytmetyka wskaźnika na 'void *' jest niedozwolona. –