2009-09-22 3 views

ответ

28

GCC атрибуты:

  • Функциональные атрибуты описаны here
  • Переменные атрибуты описаны here
  • атрибуты типа описаны here
+4

Хотя эти ссылки полезны, этот ответ сам по себе не предоставляет никакой информации. –

9

Одно из них предназначено для обеспечения выравнивания памяти для переменных и элементов структуры. Например

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

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

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

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

-2

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

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

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

+4

Э-э, я не думаю, что он используется специально для обеспечения переносимости. – GManNickG

+1

@mpl Так что не используйте его. Атрибуты позволяют выжать больше из вашего оборудования, но вы не вынуждены это делать. – qrdl

+0

@GMan: когда он используется, это один из эффектов, который он будет иметь. – mlp

16

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

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

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

Смежные вопросы