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