C attribute: unsequenced, reproducible (since C23)
Fournit au compilateur des informations concernant l'accès aux objets par une fonction, permettant de déduire certaines propriétés des appels de fonction.
Table des matières |
Syntaxe
[[
unsequenced
]]
[[
__unsequenced__
]]
|
(1) | ||||||||
[[
reproducible
]]
[[
__reproducible__
]]
|
(2) | ||||||||
Explication
Ces attributs s'appliquent à un déclarateur de fonction ou à un spécificateur de type qui a un type fonction. L'attribut correspondant est une propriété du type fonction.
Sans effet
Une évaluation d'un appel de fonction est sans effet si toute opération de stockage qui est séquencée durant l'appel est la modification d'un objet qui se synchronise avec l'appel ; si en outre l'opération est observable, tout accès à l'objet doit être basé sur un paramètre de pointeur unique de la fonction.
Idempotent
Une évaluation E est idempotente si une seconde évaluation de E peut être séquencée immédiatement après l'originale sans modifier la valeur résultante, s'il y en a une, ou l'état observable de l'exécution.
Sans état
Une fonction F est sans état si toute définition d'un objet de durée de stockage statique ou de thread storage duration dans F ou dans une fonction appelée par F est const mais non qualifiée volatile .
Indépendant
Une fonction F est indépendante si pour tout objet X qui est observé par un appel à F via une lvalue qui n'est pas basée sur un paramètre de l'appel, tous les accès à X dans tous les appels à F durant la même exécution du programme observent la même valeur ; sinon, si l'accès est basé sur un paramètre pointeur, il doit y avoir un unique paramètre pointeur P tel que tout accès à X doit être à une lvalue qui est basée sur P .
Un objet X est observé par un appel de fonction si les deux se synchronisent, si X n'est pas local à l'appel, si X a une durée de vie qui commence avant l'appel de fonction, et si un accès à X est séquencé pendant l'appel ; la dernière valeur de X , s'il y en a une, qui est stockée avant l'appel est dite être la valeur de X qui est observée par l'appel.
Notes
Ces attributs existent dans le but d'optimisation du compilateur.
Si une fonction est reproductible, plusieurs appels ultérieurs peuvent être traités comme un seul appel.
Si une fonction est non séquencée, plusieurs appels ultérieurs peuvent être traités comme un seul appel, et les appels peuvent être parallélisés et réordonnés arbitrairement.