Атрибут C: неупорядоченный, воспроизводимый (с C23)
Предоставляет компилятору информацию об доступе к объектам функцией, таким образом, что определённые свойства вызовов функций могут быть выведены.
Синтаксис
[[ unsequenced ]][[ __unsequenced__ ]] | (1) | |
[[ reproducible ]][[ __reproducible__ ]] | (2) |
Объяснение
Эти атрибуты применяются к декларатору функции или к спецификатору типа, имеющему тип функции. Соответствующий атрибут является свойством типа функции.
Без побочных эффектов
Оценивание вызова функции без побочных эффектов, если любая операция сохранения, упорядоченная во время вызова, является модификацией объекта, который синхронизируется с вызовом; если дополнительно операция наблюдаема, весь доступ к объекту должен быть основан на уникальном параметре-указателе функции.
Идемпотентность
Оценивание E является идемпотентным, если второе оценивание E может быть упорядочено непосредственно после исходного, без изменения результирующего значения, если таковое имеется, или наблюдаемого состояния выполнения.
Бессостоятельность
Функция F является бессостоятельной, если любое определение объекта со статическим или потоковым временем хранения в F или в функции, вызываемой F, является const но не volatile квалифицированным.
Независимость
Функция F является независимой, если для любого объекта X, который наблюдается вызовом F через lvalue, который не основан на параметре вызова, весь доступ к X во всех вызовах F во время одного выполнения программы наблюдает одно и то же значение; в противном случае, если доступ основан на параметре-указателе, должен быть уникальный такой параметр-указатель P, что любой доступ к X должен быть к lvalue, который основан на P.
Объект X наблюдается вызовом функции, если оба синхронизируются, если X не является локальным для вызова, если X имеет срок жизни, который начинается до вызова функции, и если доступ к X упорядочен во время вызова; последнее значение X, если таковое имеется, которое сохраняется перед вызовом, считается значением X, наблюдаемым вызовом.
Примечания
Эти атрибуты существуют для целей оптимизации компилятора.
Если функция воспроизводима, несколько последующих вызовов могут обрабатываться как один вызов.
Если функция неупорядоченная, несколько последующих вызовов могут обрабатываться как один вызов, а вызовы могут быть параллелизованы и произвольно переупорядочены.
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/attributes/unsequenced