На процессорах Intel выборки 32-разрядных выровненных данных значительно быстрее, чем неровности; на многих других процессорах выровненные выборки могут быть незаконным вообще, или их нужно моделировать, используя 2 инструкции. Таким образом, первая структура будет иметь c
всегда на этих 32-разрядных архитектурах, выровненных по байтовому адресу, делящемуся на 4. Это, однако, требует, чтобы 2 байта были потрачены впустую на хранение.
struct s1 {
void *a;
char b[2];
int c;
};
// Byte layout in memory (32-bit little-endian):
// | a0 | a1 | a2 | a3 | b0 | b1 | NA | NA | c0 | c1 | c2 | c3 |
// addresses increasing ====>
С другой стороны, иногда вам абсолютно необходимо сопоставить некоторые невыровненные datastructures (например, форматы файлов или сетевых пакетов), как это, в структуры С; там вы можете использовать __attribute__((packed))
, чтобы указать, что вы хотите все без отступа байт:
struct s2 {
void *a;
char b[2];
int c;
} __attribute__((packed));
// Byte layout in memory (32-bit little-endian):
// | a0 | a1 | a2 | a3 | b0 | b1 | c0 | c1 | c2 | c3 |
// addresses increasing ====>
это также может врезаться (в зависимости от оборудования). –
@TomTanner Doh, конечно. Спасибо, я редактировал. – unwind