Только что заметил что-то странное для меня. Visual C ++ по умолчанию не выравнивает объект в требуемой границе. Например, long long выравнивается по границе 4 байта, а __alignof (T) возвращает 8 (насколько я вижу, он всегда возвращает размер типа). Похоже, что он не выровнен должным образом. Например
long long a1;
char g;
long long a2;
// alignment check for &a2 fails
if (((uintptr_t)&a2 & (__alignof(long long) - 1)) != 0) // failed
Я также пытался просто напечатать указатель, значение &a2
равно 0x0035F8FC
(3537148
в декабре).
Есть ли что-то, что я ошибаюсь? Мне нужен правильно выровненный объект типа long long. Что я могу с этим поделать?
Я мог бы использовать __declspec(align())
расширение Microsoft, но оно требует буквального числа, поэтому я не могу написать ничего подобного.
__declspec(align(__alignof(long long))) long long object;