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