Почему и как __attribute__
используется в программах GNU C?
__attribute__ в GNU C
Ответ 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? См. Другие ответы, которые касаются этого.