Namespaces
Variants

C attribute: unsequenced, reproducible (since C23)

From cppreference.net

Предоставляет компилятору информацию о доступе функции к объектам, что позволяет выводить определённые свойства вызовов функций.

Содержание

Синтаксис

[[ unsequenced ]]
[[ __unsequenced__ ]]
(1)
[[ reproducible ]]
[[ __reproducible__ ]]
(2)
1) Указывает, что функция является effectless , idempotent , stateless и independent .
2) Указывает, что функция не имеет побочных эффектов и идемпотентна.

Объяснение

Эти атрибуты применяются к декларатору функции или к спецификатору типа, который имеет тип функции. Соответствующий атрибут является свойством типа функции.

Без эффекта

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

Идемпотентный

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

Stateless

Функция F является stateless (бессостоятельной), если любое определение объекта со статической или потоковой длительностью хранения в F или в функции, вызываемой F , является const , но не volatile квалифицированным.

Независимый

Функция F является независимой, если для любого объекта X , который наблюдается вызовом F через lvalue, не основанное на параметре вызова, все обращения к X во всех вызовах F в течение того же выполнения программы наблюдают одно и то же значение; в противном случае, если обращение основано на параметре-указателе, должен существовать уникальный такой параметр-указатель P , такой что любое обращение к X должно быть к lvalue, основанному на P .

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

Примечания

Эти атрибуты существуют для целей оптимизации компилятора.

Если функция воспроизводима, несколько последующих вызовов можно рассматривать как один вызов.

Если функция является неупорядоченной, несколько последующих вызовов могут рассматриваться как один вызов, а вызовы могут быть параллелизованы и переупорядочены произвольным образом.