Почему и как __attribute__
используется в программах GNU C?__attribute__ in GNU C
ответ
Одно из них предназначено для обеспечения выравнивания памяти для переменных и элементов структуры. Например
float vect[4] __attribute__((aligned(16)));
гарантирует, что vect
будут размещены на границе памяти в 16 байт. Я не знаю, является ли это gcc-ism или более общеприменимым.
Компилятор обычно выравнивает только vect
на границе 4 байта. С выравниванием по 16 байт он может использоваться непосредственно с инструкциями загрузки SIMD, где вы загружаете его в 128-битные регистры, которые позволяют сложение, вычитание, точечные продукты и всевозможные векторные операции.
Иногда требуется выравнивание, чтобы структура могла непосредственно накладываться на регистры аппаратного обеспечения, отображаемые в памяти. Или он должен быть выровнен, поэтому аппаратное обеспечение может записывать в него напрямую, используя механизм прямого доступа к памяти (DMA).
Почему он используется в программах C? Чтобы ограничить их переносимость.
Он начинается с двойного подчеркивания, поэтому он находится в пространстве имён разработчика - это не что-то определенное стандартом языка, и каждый поставщик компилятора может использовать его для каких-либо целей.
Редактировать: Почему он используется в программах GNU C? См. Другие ответы, которые касаются этого.
Э-э, я не думаю, что он используется специально для обеспечения переносимости. – GManNickG
@mpl Так что не используйте его. Атрибуты позволяют выжать больше из вашего оборудования, но вы не вынуждены это делать. – qrdl
@GMan: когда он используется, это один из эффектов, который он будет иметь. – mlp
Для использования компиляторов GCC и GCC __attribute__
большинство других компиляторов используют директивы #pragma
.
Я думаю, что решение ССЗ лучше, так как требуемое поведение непризнанного #pragma
является игнорировать его, в то время как если вы используете компилятор, который не понимает в __attribute__
спецификации, он не будет компилироваться - который, как правило, лучше, так как вы тогда знайте, что вам нужно для порта.
Спецификации атрибутов используются для указания аспектов типов, данных и функций, таких как хранение и выравнивание, которые не могут быть заданы с использованием C. Часто они являются целевыми, в основном они не переносятся, конечно, между компиляторами и часто между целями , Избегайте их использования, кроме случаев, когда это абсолютно необходимо для правильной функции кода.
- 1. Что означает $^in gnu?
- 2. Visual C++ эквивалент __attribute__ GCC (в (__packed__))
- 3. GNU Radio QT GUI Sink in C++
- 4. Компилятор Oracle Pro * C и gnu C (__builtin_va_list, __attribute__ и т. Д.)
- 5. GSL-GNU in Visual studio
- 6. Ошибка C: ожидается `= ',`,', `; ',` asm' или `__attribute__ 'до
- 7. for loop in GNU Parallel
- 8. __cxa_finalize и __attribute__
- 9. Что использовать __attribute__ (format) в C для определения функции?
- 10. double text substituion in GNU Make
- 11. __attribute __ ((const)) vs __attribute __ ((чистый)) в GNU C
- 12. __attribute__ ((__constructor__)) в android
- 13. Что такое __attribute__ vector_size?
- 14. портативный __attribute__ ((__packed__))
- 15. Работа с __attribute__ в MSVC
- 16. C++ GNU Linker Ошибка
- 17. Ошибка сегментации - GNU C
- 18. Gnu make with multiple% in pattern rule?
- 19. gnu make recreating directory structure in target
- 20. run grep from in GNU make
- 21. Anomolies in Seaside в GNU Smalltalk
- 22. File I/O in gnu parallel
- 23. мой компилятор говорит, что эта вещь __attribute__ неправильно, ошибка синтаксиса
- 24. Настройки стиля c c c gnu?
- 25. Структура упаковки с использованием __attribute __ ((__ставляется__)) в GNU GCC
- 26. Ошибка связи GNU C и C++
- 27. Ошибка AVR-C: ожидается '=', ',', ';', 'asm' или '__attribute__' перед '<' token
- 28. Что такое эквивалент IAR '__attribute__ ((слабый, псевдоним (#f)))?
- 29. Ожидаемое ':', '', ';', '}' или '__attribute__' перед '=' маркер
- 30. Visual Studio эквивалент __attribute__ ((warn_unused_result))
Хотя эти ссылки полезны, этот ответ сам по себе не предоставляет никакой информации. –