выравнивание памяти для структуры - PullRequest
2 голосов
/ 13 февраля 2012

У меня есть структура с тремя полями, определенными следующим образом:

struct tmp {
    char *ptr;
    unsigned int data1;
    unsigned int data2;
};

После компиляции с GCC в 64-битной системе с использованием процессора Intel Sandybridge, sizeof (tmp) возвращает 24.

Насколько я понимаю, компилятор добавляет 4 байта в оба поля "unsigned int".Однако, может ли быть лучше, если нет отступов и полученная структура имеет размер 16?

Представьте, что если существует массив таких структур, то если заставить структуру иметь размер 16, убедитесь, что в массиве нет единой структуры, разделяемой по строкам кэша, поскольку размер строки кэша равен 64.байты для процессоров Intel SandyBridge.Таким образом, уменьшается возможность иметь два обращения к памяти для получения такой структуры при циклическом просмотре массива.

1 Ответ

1 голос
/ 13 февраля 2012

Я не понимаю, почему ваш компилятор хотел бы дополнить элементы unsigned int, предполагая, что у вас нет какой-то странной настройки, где unsigned int не 32-битный. На моем GCC я получаю sizeof(struct tmp) == 16.

Что произойдет, если вы распечатаете адрес каждого участника? Это должно помочь вам понять, где находится отступ. Но в любом случае вы должны быть в состоянии избавиться от отступов, сказав GCC упаковать структуру, например так:

struct tmp {
    char *ptr;
    unsigned int data1;
    unsigned int data2;
} __attribute__((packed));
...