6.32.1 Общие атрибуты переменных
Следующие атрибуты поддерживаются на большинстве целевых платформ.
aligned (alignment)-
Этот атрибут задает минимальное выравнивание для переменной или поля структуры, измеряемое в байтах. Например, объявление:
int x __attribute__ ((aligned (16))) = 0;
приводит к тому, что компилятор выделяет глобальную переменную
xна границе 16 байт. На платформе 68040 это можно использовать совместно с выражениемasm, чтобы получить доступ к инструкцииmove16, которая требует выравнивания операндов на 16 байт.Вы также можете указать выравнивание полей структуры. Например, чтобы создать пару
intс выравниванием на границе двойного слова, можно написать: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 разместить переменную в хранилище «common». Атрибут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. Это позволяет запросить целочисленный или вещественный тип в соответствии с его разрядностью.
См. Режимы машин в GNU Compiler Collection (GCC) Internals, для получения списка возможных ключевых слов для 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-local storage (см. Thread-Local) для конкретной__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-битный int (вектор из 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-7.5.0/gcc/Common-Variable-Attributes.html