Из этого вопроса можно было предположить, что мировоззрение союза не меньше, чем наибольшее мировоззрение его отдельных членов. Но у меня проблема с типом 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
Почему мировоззрение члена союза больше, чем мировоззрение содержащего союза?
[ОБНОВЛЕНИЕ]
Согласно ответу Кейта , 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 в глобальных данных. Для локальной области я не могу проверить это, так как кажется, что компилятор может изменить локальные данные -, поэтому этот трюк не работает. Вы можете это прокомментировать?
[/ОБНОВЛЕНИЕ]