Spec-Zone.ru › GCC 14

7.7 Атрибуты переменных, функций и типов, специфичные для C++

Некоторые атрибуты имеют смысл только для программ на C++.

abi_tag ("tag", ...)

Атрибут abi_tag может быть применён к объявлению функции, переменной или класса. Он изменяет сгенерированное имя сущности, включив в него имя тега, чтобы отличить функцию или класс от более ранней версии с другим ABI; возможно, размер класса изменился, или у функции другой тип возвращаемого значения, который не закодирован в сгенерированном имени.

Атрибут также может быть применён к вложенному пространству имён, но не влияет на сгенерированное имя пространства имён; в этом случае он используется только для предупреждений -Wabi-tag и автоматической разметки функций и переменных. Разметка вложенных пространств имён обычно предпочтительнее, чем разметка отдельных объявлений, но последнее иногда необходимо, например, когда нужно пометить только определённые члены класса.

Аргументом может быть список строк произвольной длины. Строки сортируются при выводе, поэтому порядок списка не имеет значения.

Переобъявление сущности не должно добавлять новые теги ABI, так как это изменит сгенерированное имя.

Теги ABI относятся к имени, поэтому все экземпляры и специализации шаблона имеют те же теги. Атрибут будет проигнорирован, если применён к явной специализации или экземпляру.

Флаг -Wabi-tag активирует предупреждение о классе, у которого отсутствуют все теги ABI, используемые его подобъектами и виртуальными функциями; для пользователей, код которых должен сосуществовать с более ранним ABI, использование этого флага может помочь найти все затронутые типы, которые нужно пометить.

Когда тип, использующий тег ABI, используется в качестве типа переменной или возвращаемого типа функции, где этот тег ещё не присутствует в сигнатуре функции, тег автоматически применяется к переменной или функции. -Wabi-tag также выводит предупреждение об этой ситуации; это предупреждение можно избежать, явно пометив переменную или функцию или поместив её во вложенное пространство имён с тегом.

init_priority (priority)

В стандартном C++, объекты, определённые на уровне пространства имён, гарантированно инициализируются в строгом соответствии с порядком их определений в данном модуле трансляции. Нет гарантии для инициализации в разных модулях трансляции. Однако GNU C++ позволяет пользователям контролировать порядок инициализации объектов, определённых на уровне пространства имён, с помощью атрибута init_priority путём указания относительного приоритета, целочисленного константного выражения, в настоящее время ограниченного значениями от 101 до 65535 включительно. Более низкие числа означают более высокий приоритет.

В следующем примере, A обычно создаётся до B, но атрибут init_priority изменяет этот порядок:

Some_Class  A  __attribute__ ((init_priority (2000)));
Some_Class  B  __attribute__ ((init_priority (543)));

Обратите внимание, что конкретные значения приоритета не имеют значения; важно только их относительное упорядочение.

no_dangling

Этот атрибут может быть применён к типу класса, функции или члену функции. Висячие ссылки на классы, помеченные этим атрибутом, будут иметь диагностику -Wdangling-reference подавленной; также будут ссылки, возвращаемые от функций, помеченных gnu::no_dangling. Например:

class [[gnu::no_dangling]] S { … };

Или:

class A {
  int *p;
  [[gnu::no_dangling]] int &foo() { return *p; }
};

[[gnu::no_dangling]] const int &
foo (const int &i)
{
  …
}

Этот атрибут принимает необязательный аргумент, который должен быть выражением, оценивающимся как true или false:

template <typename T>
struct [[gnu::no_dangling(std::is_reference_v<T>)]] S {
  …
};

Или:

template <typename T>
[[gnu::no_dangling(std::is_lvalue_reference_v<T>)]]
decltype(auto) foo(T&& t) {
  …
};
warn_unused

Для типов C++, имеющих нетривиальные конструкторы и/или деструкторы, компилятору невозможно определить, является ли переменная этого типа действительно неиспользуемой, если она не ссылается. Этот атрибут типа сообщает компилятору, что о переменных этого типа следует предупреждать, если они, похоже, не используются, как и о переменных фундаментальных типов.

Этот атрибут подходит для типов, которые просто представляют значение, например, std::string; он не подходит для типов, которые управляют ресурсами, например, std::lock_guard.

Этот атрибут также принимается в C, но он не нужен, потому что в C нет конструкторов или деструкторов.

cold

В дополнение к функциям и меткам, GNU C++ позволяет использовать атрибут cold для C++ классов, структур или объединений. Применение атрибута cold к типу приводит к тому, что каждая функция-член типа, включая неявные специальные функции-члены, обрабатывается как холодная. Если функция-член помечена атрибутом функции hot, атрибут hot имеет приоритет, и атрибут cold не распространяется.

Эффекты атрибута cold на функции см. в разделе Общие атрибуты функций.

hot

В дополнение к функциям и меткам, GNU C++ позволяет использовать атрибут hot для C++ классов, структур или объединений. Применение атрибута hot к типу приводит к тому, что каждая функция-член типа, включая неявные специальные функции-члены, обрабатывается как горячая. Если функция-член помечена атрибутом функции cold, атрибут cold имеет приоритет, и атрибут hot не распространяется.

Эффекты атрибута hot на функции см. в разделе Общие атрибуты функций.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/C_002b_002b-Attributes.html

Spec-Zone.ru

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