C attribute: unsequenced, reproducible (since C23)
Proporciona al compilador información sobre el acceso a objetos por parte de una función, de modo que se puedan deducir ciertas propiedades de las llamadas a funciones.
Contenidos |
Sintaxis
[[
unsequenced
]]
[[
__unsequenced__
]]
|
(1) | ||||||||
[[
reproducible
]]
[[
__reproducible__
]]
|
(2) | ||||||||
Explicación
Estos atributos se aplican a un declarador de función o a un especificador de tipo que tiene un tipo de función. El atributo correspondiente es una propiedad del tipo de función.
Sin efecto
Una evaluación de una llamada a función es sin efectos si cualquier operación de almacenamiento que está secuenciada durante la llamada es la modificación de un objeto que sincroniza con la llamada; si adicionalmente la operación es observable, todo acceso al objeto debe basarse en un parámetro de puntero único de la función.
Idempotente
Una evaluación E es idempotente si una segunda evaluación de E puede ser secuenciada inmediatamente después de la original sin cambiar el valor resultante, si lo hay, o el estado observable de la ejecución.
Sin estado
Una función F es sin estado si cualquier definición de un objeto de duración de almacenamiento estática o de hilo storage duration en F o en una función que es llamada por F es const pero no volatile calificada.
Independiente
Una función F es independiente si para cualquier objeto X que es observado por una llamada a F a través de un lvalue que no está basado en un parámetro de la llamada, todos los accesos a X en todas las llamadas a F durante la misma ejecución del programa observan el mismo valor; de lo contrario, si el acceso está basado en un parámetro puntero, debe existir un único parámetro puntero P tal que cualquier acceso a X debe ser a un lvalue que esté basado en P .
Un objeto X es observado por una llamada de función si ambos se sincronizan, si X no es local a la llamada, si X tiene un tiempo de vida que comienza antes de la llamada de función, y si un acceso de X está secuenciado durante la llamada; el último valor de X , si existe, que se almacena antes de la llamada se dice que es el valor de X que es observado por la llamada.
Notas
Estos atributos existen con el propósito de optimización del compilador.
Si una función es reproducible, múltiples llamadas posteriores pueden tratarse como una única llamada.
Si una función no está secuenciada, múltiples llamadas posteriores pueden tratarse como una única llamada, y las llamadas pueden paralelizarse y reordenarse arbitrariamente.