
138
Атрибут aligned (выравнивание)
Этот атрибут определяет минимальное выравнивание для переменной или
поля структуры, измеряемое в байтах. Например, объявление
int x __attribute__ ((aligned (16))) = 0;
заставляет компилятор размещать глобальную переменную x по 16-
байтной границе. На 68040 это может быть использовано вместе с asm
выражением, чтобы использовать инструкцию move16, которой требуются
операнды, выравненные на 16 байт.
Вы можете также указать выравнивание полей структуры. Например, для
создания пары int, выравненной на границу двойного слова, вы могли бы
написать:
struct foo { int x[2] __attribute__ ((aligned (8))); };
Это является альтернативой созданию объединения с double членом,
который заставляет выравнивать объединение на границу двойного слова.
Невозможно определять выравнивание функций, оно определяется
требованиями машины и не может быть изменено. Вы не можете указать
выравнивание для typedef имени, потому что такое имя является только
синонимом, а не отдельным типом.
Как в предыдущих примерах, вы
можете явно указать выравнивание (в
байтах), которое вы хотели бы, чтобы использовал компилятор для данной
переменной или поля структуры. В качестве альтернативы, вы можете оставить
размер выравнивания и только попросить компилятор выравнивать переменную
или поле по максимальному полезному выравниванию для целевой машины,
для которой вы компилируете. Например, вы могли бы
написать:
short array[3] __attribute__ ((aligned));
Атрибут aligned может только увеличить выравнивание, но вы можете
уменьшить его с помощью указания packed. (см. ниже).
Заметим, что эффективность атрибутов aligned может быть ограничена
ограничениями вашего линкера. Во многих системах линкер может только
обрабатывать выравнивание переменных, не превышающее определенного
предела. (Для некоторых линкеров максимальное поддерживаемое
выравнивание может быть очень и очень малым.) См
. документацию по вашему
линкеру для дальнейшей информации.
Атрибут mode (вид)
Этот атрибут указывает тип данных для объявления – тип, который
соответствует виду 'вид'. Это в действительности позволяет вам требовать
целый или плавающий тип в соответствии с его размером. Вы можете также
указать вид 'byte', чтобы указать вид, соответствующий однобайтовому целому,
'word' для вида однословного целого и 'pointer' для вида, используемого для