6.32.1 Общие атрибуты переменных
Следующие атрибуты поддерживаются на большинстве целевых платформ.
aligned (alignment)-
Этот атрибут задаёт минимальное выравнивание для переменной или поля структуры, измеряемое в байтах. Например, объявление:
int x __attribute__ ((aligned (16))) = 0;
приводит к тому, что компилятор выделяет глобальную переменную
xна границе 16 байт. На платформе 68040 это можно использовать совместно с выражениемasm, чтобы получить доступ к инструкцииmove16, которая требует операндов с выравниванием 16 байт.Вы также можете задать выравнивание полей структуры. Например, для создания пары полей структуры с выравниванием по слову двойной точности можно написать:
struct foo { int x[2] __attribute__ ((aligned (8))); };Это альтернатива созданию объединения с членом
double, которое принудительно выравнивает объединение по слову двойной точности.Как и в предыдущих примерах, вы можете явно задать выравнивание (в байтах), которое вы хотите использовать для данной переменной или поля структуры. В качестве альтернативы, вы можете опустить множитель выравнивания и просто попросить компилятор выровнять переменную или поле по умолчанию для целевой архитектуры, для которой вы компилируете. Умолчание достаточно для всех скалярных типов, но может быть недостаточно для всех векторных типов на целевой платформе, поддерживающей векторные операции. Значение по умолчанию фиксировано для определённого целевого ABI.
GCC также предоставляет целевой макрос
__BIGGEST_ALIGNMENT__, который является максимальным значением выравнивания, когда-либо использовавшимся для любого типа данных на целевой машине, для которой вы компилируете. Например, вы можете написать:short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));
Компилятор автоматически устанавливает выравнивание для объявленной переменной или поля в
__BIGGEST_ALIGNMENT__. Это часто делает операции копирования более эффективными, так как компилятор может использовать любые инструкции для копирования больших блоков памяти при выполнении операций копирования в переменные или поля, выровненные таким образом. Обратите внимание, что значение__BIGGEST_ALIGNMENT__может изменяться в зависимости от параметров командной строки.При использовании на структуре или члене структуры атрибут
alignedможет только увеличить выравнивание; для уменьшения выравнивания также должен быть указан атрибутpacked. При использовании как части typedef атрибутalignedможет как увеличивать, так и уменьшать выравнивание, а указание атрибутаpackedприводит к предупреждению.Обратите внимание, что эффективность атрибутов
alignedможет быть ограничена внутренними ограничениями вашего компоновщика. На многих системах компоновщик может только организовать выравнивание переменных до определённого максимального значения. (Для некоторых компоновщиков максимальное поддерживаемое выравнивание может быть очень малым.) Если ваш компоновщик способен выравнивать переменные только до максимального выравнивания 8 байт, то указаниеaligned(16)в__attribute__всё ещё даёт только выравнивание 8 байт. Обратитесь к документации вашего компоновщика для получения дополнительной информации.Атрибут
alignedтакже может быть использован для функций (см. Общие атрибуты функций). cleanup (cleanup_function)-
Атрибут
cleanupвыполняет функцию, когда переменная выходит из области видимости. Этот атрибут может быть применён только к переменным авто-функций, он не может быть применён к параметрам или переменным со статической длительностью хранения. Функция должна принимать один параметр, указатель на тип, совместимый с переменной. Значение возврата функции (если таковое имеется) игнорируется.Если включён -fexceptions, то cleanup_function выполняется во время разматывания стека, происходящего во время обработки исключения. Обратите внимание, что атрибут
cleanupне позволяет перехватить исключение, а только выполнить действие. Неопределено, что произойдёт, если cleanup_function не вернётся нормально. commonnocommon-
Атрибут
commonзапрашивает у GCC разместить переменную в «общей» области памяти. Атрибутnocommonзапрашивает обратное — выделить место для неё напрямую.Эти атрибуты переопределяют значения по умолчанию, выбранные флагами -fno-common и -fcommon соответственно.
deprecateddeprecated (msg)-
Атрибут
deprecatedприводит к предупреждению, если переменная используется где-либо в исходном файле. Это полезно при определении переменных, которые, как ожидается, будут удалены в будущей версии программы. Предупреждение также включает местоположение объявления устаревшей переменной, чтобы пользователи могли легко найти дополнительную информацию о причине устаревания переменной или о том, что им следует сделать вместо этого. Обратите внимание, что предупреждение появляется только при использовании:extern int old_var __attribute__ ((deprecated)); extern int old_var; int new_fn () { return old_var; }Это приводит к предупреждению на строке 3, но не на строке 2. Необязательный аргумент msg, который должен быть строкой, выводится в предупреждении, если он присутствует.
Атрибут
deprecatedтакже может использоваться для функций и типов (см. Общие атрибуты функций, см. Общие атрибуты типов). mode (mode)-
Этот атрибут задаёт тип данных для объявления — тот тип, который соответствует режиму mode. Это фактически позволяет запрашивать целочисленный или с плавающей точкой тип в зависимости от его ширины.
Вы также можете задать режим
byteили__byte__для указания режима, соответствующего целому числу в одном байте,wordили__word__для режима целочисленного числа в одном слове иpointerили__pointer__для режима, используемого для представления указателей. packed-
Атрибут
packedуказывает, что переменная или поле структуры должно иметь наименьшее возможное выравнивание — один байт для переменной и один бит для поля, если вы не укажете большее значение с помощью атрибутаaligned.Вот структура, в которой поле
xупаковано, так что оно сразу следует заa:struct foo { char a; int x[2] __attribute__ ((packed)); };Примечание: версии GCC 4.1, 4.2 и 4.3 игнорируют атрибут
packedдля битовых полей типаchar. Это было исправлено в GCC 4.4, но изменение может привести к различиям в расположении структуры. См. документацию -Wpacked-bitfield-compat для получения дополнительной информации. section ("section-name")-
Обычно компилятор помещает сгенерированные объекты в секции, такие как
dataиbss. Однако иногда вам нужны дополнительные секции или вам нужно, чтобы определённые переменные появлялись в специальных секциях, например, для отображения на специальное оборудование. Атрибутsectionуказывает, что переменная (или функция) находится в определённой секции. Например, эта небольшая программа использует несколько конкретных имён секций:struct duart a __attribute__ ((section ("DUART_A"))) = { 0 }; struct duart b __attribute__ ((section ("DUART_B"))) = { 0 }; char stack[10000] __attribute__ ((section ("STACK"))) = { 0 }; int init_data __attribute__ ((section ("INITDATA"))); main() { /* Initialize stack pointer */ init_sp (stack + sizeof (stack)); /* Initialize initialized data */ memcpy (&init_data, &data, &edata - &data); /* Turn on the serial ports */ init_duart (&a); init_duart (&b); }Используйте атрибут
sectionсо глобальными переменными, а не с локальными, как показано в примере.Вы можете использовать атрибут
sectionс инициализированными или неинициализированными глобальными переменными, но компоновщику требуется, чтобы каждый объект был определён один раз, за исключением того, что неинициализированные переменные предварительно помещаются в секциюcommon(илиbss) и могут быть определены несколько раз. Использование атрибутаsectionизменяет секцию, в которую попадает переменная, и может привести к ошибке компоновщика, если у неинициализированной переменной имеется несколько определений. Вы можете принудительно инициализировать переменную с помощью флага -fno-common или атрибутаnocommon.Некоторые форматы файлов не поддерживают произвольные секции, поэтому атрибут
sectionнедоступен на всех платформах. Если вам нужно отобразить всё содержимое модуля в определённую секцию, рассмотрите использование средств компоновщика. tls_model ("tls_model")-
Атрибут
tls_modelзадаёт модель хранения потоков данных (см. Потоково-локальные) для конкретной__threadпеременной, переопределяя переключатель командной строки -ftls-model= на основе переменной. Аргумент tls_model должен быть одним изglobal-dynamic,local-dynamic,initial-execилиlocal-exec.Не все целевые платформы поддерживают этот атрибут.
unused-
Этот атрибут, прикреплённый к переменной, означает, что переменная может быть неиспользуемой. GCC не выдаёт предупреждение для этой переменной.
used-
Этот атрибут, прикреплённый к переменной со статической длительностью хранения, означает, что переменная должна быть выведена, даже если, кажется, что к переменной нет ссылок.
При применении к статическому члену данных класса C++, атрибут также означает, что член инициализируется, если сам класс инициализируется.
vector_size (bytes)-
Этот атрибут задаёт размер вектора для переменной, измеряемый в байтах. Например, объявление:
int foo __attribute__ ((vector_size (16)));
приводит к тому, что компилятор устанавливает режим для
foo, равный 16 байтам, разделённым на единицы размераint. Предполагая 32-битное целое число (вектор из 4 единиц по 4 байта), соответствующий режимfoo— V4SI.Этот атрибут применим только к целочисленным и с плавающей точкой скалярам, хотя массивы, указатели и значения возврата функций допускаются в сочетании с этим конструктом.
Агрегаты с этим атрибутом недействительны, даже если они имеют такой же размер, как соответствующий скаляр. Например, объявление:
struct S { int a; }; struct S __attribute__ ((vector_size (16))) foo;недействительно, даже если размер структуры такой же, как размер
int. visibility ("visibility_type")-
Этот атрибут влияет на связь объявления, к которому он прикреплён. Атрибут
visibilityописан в Общих атрибутах функций. weak-
Атрибут
weakописан в Общих атрибутах функций.
Далее: Атрибуты переменных AVR, Назад: Атрибуты переменных [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/Common-Variable-Attributes.html