Spec-Zone.ru › GCC 6

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 не вернётся нормально.

common
nocommon

Атрибут common запрашивает у GCC разместить переменную в «общей» области памяти. Атрибут 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. Это фактически позволяет запрашивать целочисленный или с плавающей точкой тип в зависимости от его ширины.

Вы также можете задать режим 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

Spec-Zone.ru

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