Dlaczego wyrównywanie długiego długiego elementu unii jest większe niż zawierające union / struct? Czy to jest poprawne?

Zto pytanie można by zacząć wierzyć, że ujednolicenie związku nie jest mniejsze niż największe dopasowanie jego poszczególnych członków. Ale mam problem zlong long wpisz gcc / g ++. Pełny przykład można znaleźćtutaj, ale oto odpowiednie części mojego pytania:

union ull {
  long long m;
};

struct sll {
  long long m;
};


int main() {
#define pr(v) cout << #v ": " << (v) << endl
   pr(sizeof(long long));
   pr(__alignof__(long long));
   pr(sizeof(ull));
   pr(__alignof__(ull));
   pr(sizeof(sll));
   pr(__alignof__(sll));
};

Powoduje to następujące wyjście:

sizeof(long long): 8
__alignof__(long long): 8
sizeof(ull): 8
__alignof__(ull): 4
sizeof(sll): 8
__alignof__(sll): 4

Dlaczego wyrównanie członu unii jest większe niż unii zawierającej?

[AKTUALIZACJA]

Zgodnie z odpowiedzią Keithaalignof jest tutaj źle. Ale testuję poniższe i wydaje się, że takalignof mówi nam prawdę. Widzieć:

union ull {
  long long m;
};
long long a;
char b;
long long c;
char d;
ull e;
int main() {
#define pr(v) cout << #v ": " << (v) << endl
   pr(size_t((void*)&b));
   pr(size_t((void*)&c));
   pr(size_t((void*)&d));
   pr(size_t((void*)&e));
   pr(size_t((void*)&c) - size_t((void*)&b));
   pr(size_t((void*)&e) - size_t((void*)&d));
};

Wyjście:

size_t((void*)&b): 134523840
size_t((void*)&c): 134523848
size_t((void*)&d): 134523856
size_t((void*)&e): 134523860
size_t((void*)&c) - size_t((void*)&b): 8
size_t((void*)&e) - size_t((void*)&d): 4

Tak więc wyrównanielong long jest 8 i wyrównanie zawierające związeklong long wynosi 4 w danych globalnych. W zakresie lokalnym nie mogę tego przetestować, ponieważ wydaje się, że kompilator może dowolnie zmieniać dane lokalne - więc ten trik nie działa. Czy możesz to skomentować?

[/AKTUALIZACJA]

questionAnswers(1)

yourAnswerToTheQuestion