命名空间
变体
操作

C 属性: 无序,可重现 (自 C23 起)

来自 cppreference.com
< c‎ | 语言‎ | 属性

向编译器提供有关函数访问对象的信息,以便可以推断函数调用的某些属性。

内容

[编辑] 语法

[[ unsequenced ]]
[[ __unsequenced__ ]]
(1)
[[ reproducible ]]
[[ __reproducible__ ]]
(2)
1) 表示函数是 无副作用幂等无状态独立 的。
2) 表示函数是无副作用和幂等的。

[编辑] 解释

这些属性适用于函数声明符或具有函数类型的类型说明符。相应的属性是函数类型的属性。

[编辑] 无副作用

如果在调用期间排序的任何存储操作是修改与调用同步的对象;如果操作另外可观察,则所有对对象的访问都必须基于函数的唯一指针参数。

[编辑] 幂等

如果可以将 E 的第二次求值排序在原始求值之后,而不会改变结果值(如果有)或执行的可观察状态,则求值 E 是幂等的。

[编辑] 无状态

如果函数 F 中或 F 调用的函数中任何静态或线程 存储期 对象的定义都是 const 限定的,但不是 volatile 限定的,则函数 F 是无状态的。

[编辑] 独立

如果对于通过不是基于调用参数的左值观察到调用 F 的任何对象 X,在相同程序执行期间的所有调用 F 中对 X 的所有访问都观察到相同的值;否则,如果访问基于指针参数,则应该有一个唯一的此类指针参数 P,以使对 X 的任何访问都应该针对基于 P 的左值。

如果对象 X 与函数调用同步,如果 X 不是调用本地对象,如果 X 的生命周期在函数调用之前开始,以及如果在调用期间排序了对 X 的访问;则对象 X 被函数调用观察到;在调用之前存储的 X 的最后一个值(如果有)被称为调用观察到的 X 的值。

[编辑] 注释

这些属性是为了编译器优化而存在的。

如果函数是可重现的,则多个后续调用可以被视为单个调用。

如果函数是无序的,则多个后续调用可以被视为单个调用,并且可以任意地并行化和重新排序调用。