C 属性: unsequenced, reproducible (C23 起)
来自cppreference.com
< c | language | attributes
向编译器提供函数访问对象的信息,使其可以推导函数调用的某些性质。
语法
[[ unsequenced ]] [[ __unsequenced__ ]]
|
(1) | ||||||||
[[ reproducible ]] [[ __reproducible__ ]]
|
(2) | ||||||||
1) 指示函数无作用且幂等
解释
这些属性适用于函数声明符或者具有函数类型的类型说明符。相应属性是函数类型的性质。
无作用
如果函数调用过程中编入序列的任何存储操作,都是对某对象的同步于此次调用的修改,则该调用的执行是无作用的;如果这种存储操作还是可观察的,则对该对象的所有访问必须都基于函数的一个唯一指针形参进行。
幂等
对于某个求值 E,若 E 的第二次求值可以紧跟第一次求值编入序列而不改变结果值(如果有)或执行的可观察状态,则它是幂等的。
无状态
如果函数 F 或其所调用的任何函数中,具有静态或线程存储期的任意对象的定义均为 const 但无 volatile 限定,则 F 是无状态的。
无关联
对于函数 F,如果 F 的调用中可以通过并非该调用的形参的左值而观察到任何对象 X,而在同一次程序执行中所有对 F 的调用中,对 X 的所有访问都观察到相同的值,则 F 无关联;或者如果访问是通过某个指针形参进行,则应当有一个唯一的这种指针形参 P,使得对 X 的任何访问都应当是基于 P 的左值访问。
对象 X 由函数调用所观察的条件是:二者均同步,X 并非局部与此次调用,X 的生存期开始于函数调用之前,且此次调用中有对 X 的访问被排入序列;此次调用前所存储的 X 的最新值(如果有),被称为此次调用所观察到的 X 的值。
注解
这些属性为编译器优化的目的而存在。
如果函数可重现,则可将先后多次调用当做一次调用。
如果函数无顺序,则可将先后多次调用当做一次调用,且这些调用可以并行化并任意重排。