Почему выравнивание длинного длинного члена объединения больше, чем содержащее объединение / структура? Это правильно?

Отэтот вопрос Можно было бы начать полагать, что выравнивание союза не меньше, чем наибольшее выравнивание его отдельных членов. Но у меня есть проблема сlong long введите gcc / g ++. Полный пример можно найтиВот, но вот соответствующие части для моего вопроса:

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));
};

Это приводит к следующему выводу:

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

Почему выравнивание члена профсоюза больше, чем выравнивание вмещающего союза?

[UPDATE]

Согласно ответу Кейтаalignof здесь не так. Но я проверяю следующее, и кажется, чтоalignof  говорит нам правду. Увидеть:

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));
};

Выход:

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

Итак, выравниваниеlong long 8 и выравнивание объединения, содержащегоlong long 4 в глобальных данных. Для локальной области я не могу проверить это, так как кажется, что компилятор свободен переставлять локальные данные - так что этот прием не работает. Можете ли вы прокомментировать это?

[/UPDATE]

Ответы на вопрос(1)

Ваш ответ на вопрос