Подтвердить что ты не робот

__attribute__ в GNU C

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

4b9b3361

Ответ 1

GCC атрибуты:

  • Атрибуты функций описаны здесь
  • Переменные атрибуты, описанные здесь
  • Введите атрибуты типа здесь

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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