Spec-Zone.ru › GCC 7

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 не вернёт управление обычным способом.

common
nocommon

Атрибут common просит GCC разместить переменную в хранилище «common». Атрибут nocommon просит обратного — выделить место для неё непосредственно.

Эти атрибуты переопределяют значение, выбираемое по умолчанию флагами -fno-common и -fcommon соответственно.

deprecated
deprecated (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 описан в Общие атрибуты функций.

END_OF_DOCUMENT_MARKER

Далее: 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API