C ++ выравнивание структуры с выровненными членами - PullRequest
2 голосов
/ 12 февраля 2012

Всегда ли struct выровнен так же, как элемент наибольшего выравнивания этой структуры? Если нет, то как это может быть реализовано автоматически, возможно, с помощью специфичного для gcc расширения? (Я знаю, что есть __attribute((aligned(...)))__, но выравнивание должно быть указано явно).

Отличается ли это поведение между c99, c ++ 99 и c ++ 11? Есть ли в c ++ 11 дополнительные условия для обеспечения выравнивания?

Пример: С помощью следующего кода само Foo будет автоматически выровнено до 8 байт, или мне нужно также выровнять его явно?

struct Foo{
    int i __attribute__((aligned(8)));
};

1 Ответ

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

Выравнивание - это свойство системы и процессора. Компилятору разрешено делать все возможное (и он должен знать об ограничениях выравнивания процессора и системы).

Большинство спецификаций ABI (например, AMD64 ABI для Linux) содержат некоторые подсказки по выравниванию.

Я считаю, что ограничения выравнивания распространяются от полей к агрегатам (например, struct -s), содержащим их.

Если у вас необычные ограничения выравнивания для динамически размещаемых данных, вам может потребоваться явное выравнивание, например, используя posix_memalign для их выделения. malloc и связанные с ним распределители (включая ::operator new в C ++), вероятно, не будут выравниваться лучше, чем требуют ограничения по умолчанию.

...