C 属性:unsequenced, reproducible (自 C23 起)
来自 cppreference.cn
向编译器提供有关函数访问对象的信息,以便推断函数调用的某些属性。
目录 |
[编辑] 语法
[[ unsequenced ]] [[ __unsequenced__ ]] |
(1) | ||||||||
[[ reproducible ]] [[ __reproducible__ ]] |
(2) | ||||||||
2) 指示函数是无副作用且幂等的。
[编辑] 解释
这些属性适用于函数声明符或具有函数类型的类型说明符。相应的属性是函数类型的一个特性。
[编辑] 无副作用 (Effectless)
如果函数调用期间进行的任何存储操作都是对与该调用同步的对象的修改,则该函数调用的评估是无副作用的;如果此外该操作是可观察的,则对该对象的所有访问必须基于函数的一个唯一指针参数。
[编辑] 幂等 (Idempotent)
如果第二次评估 E 可以紧接在原始评估之后进行,且不改变任何结果值或执行的可观察状态,则评估 E 是幂等的。
[编辑] 无状态 (Stateless)
如果函数 F 或由 F 调用的函数中任何具有静态或线程存储期的对象定义是 const 但不是 volatile 限定的,则函数 F 是无状态的。
[编辑] 独立 (Independent)
如果对于通过不基于调用参数的左值被函数 F 的调用观察到的任何对象 X,在同一程序执行期间对 F 的所有调用中对 X 的所有访问都观察到相同的值;否则,如果访问基于指针参数,则应存在唯一的此类指针参数 P,使得对 X 的任何访问都应是对基于 P 的左值的访问。
如果对象 X 和函数调用都同步,如果 X 不是调用的局部变量,如果 X 的生命周期在函数调用之前开始,并且如果在调用期间访问了 X,则对象 X 被函数调用观察到;在调用之前存储的 X 的最后一个值(如果有)被称为被调用观察到的 X 的值。
[编辑] 注释
这些属性用于编译器优化目的。
如果函数是可重现的,则多次后续调用可以被视为一次调用。
如果函数是无序的,则多次后续调用可以被视为一次调用,并且这些调用可以并行化并任意重新排序。