__attribute__ в GNU C - PullRequest
       10

__attribute__ в GNU C

46 голосов
/ 22 сентября 2009

Почему и как __attribute__ используется в программах GNU C?

Ответы [ 4 ]

34 голосов
/ 22 сентября 2009

атрибуты GCC:

  • Атрибуты функции описаны здесь
  • Переменные атрибуты описаны здесь
  • Атрибуты типа описаны здесь
25 голосов
/ 22 сентября 2009

Для чего компиляторы, совместимые с GCC и GCC, используют __attribute__, большинство других компиляторов используют директивы #pragma.

Я думаю, что решение GCC лучше, поскольку требуемое поведение нераспознанного #pragma состоит в том, чтобы игнорировать его, тогда как если вы используете компилятор, который не понимает спецификацию __attribute__, он не будет компилироваться - что, как правило, лучше, так как вы тогда знаете, что вам нужно портировать.

Спецификации атрибутов используются для определения аспектов типов, данных и функций, таких как хранение и выравнивание, которые не могут быть заданы с помощью C. Часто они являются специфическими для целей, в основном они непереносимы, безусловно, между компиляторами и часто между целями. Избегайте их использования, за исключением случаев, когда это абсолютно необходимо для правильного функционирования кода.

16 голосов
/ 22 сентября 2009

Одно из применений - для принудительного выравнивания памяти по переменным и элементам структуры. Например

float vect[4] __attribute__((aligned(16)));

Обеспечит размещение vect на 16-байтовой границе памяти. Я не знаю, является ли это gcc-измом или в более общем смысле.

Компилятор обычно выравнивает vect только на 4-байтовой границе. С 16-байтовым выравниванием его можно использовать непосредственно с инструкциями загрузки SIMD, где вы можете загрузить его в 128-битные регистры, которые позволяют сложение, вычитание, точечные произведения и все виды векторных операций.

Иногда требуется выравнивание, чтобы структура могла быть непосредственно наложена на аппаратные регистры с отображением в памяти. Или же он должен быть выровнен, чтобы аппаратное обеспечение могло записывать в него напрямую, используя механизм прямого доступа к памяти (DMA).

0 голосов
/ 22 сентября 2009

Почему это используется в программах на C? Для ограничения их мобильности.

Он начинается с двойного подчеркивания, поэтому он находится в пространстве имен разработчика - это не то, что определено языковым стандартом, и каждый поставщик компилятора может использовать его для любых целей.

Редактировать: Почему это используется в программах GNU C? Смотрите другие ответы, которые касаются этого.

...