Рассмотрим следующую структуру
struct a{
uint16_t foo1
uint16_t foo2
uint32_t foo3
uint64_t foo4
uint16_t foo5
uint16_t foo6
}__attribute__(packed);
Это 20 байтов в длину.Это нормально, так как все в структуре выровнено по границам слов.
Однако, что произойдет, если разработчик из лучших побуждений сделает следующее:
static struct a foo;
static uint64_t b;
Теоретически это приведет к смещению bчерез границу слова.
Интересно, что gcc, кажется, выравнивает foo
до 16 байтов, однако (если мои знания о сборке верны), это позволяет b быть смещенным:
.local foo.2476
.comm foo.2476,20,16
.local b.2477
.comm b.2477,8,8
Я что-то здесь упускаю, или это пример опасности упаковки структуры?