C attribute: unsequenced, reproducible (since C23)
向编译器提供有关函数访问对象的信息,以便推导函数调用的某些属性。
目录 |
语法
[[
unsequenced
]]
[[
__unsequenced__
]]
|
(1) | ||||||||
[[
reproducible
]]
[[
__reproducible__
]]
|
(2) | ||||||||
说明
这些属性适用于函数声明符或具有函数类型的类型说明符。对应的属性是函数类型的一个属性。
无副作用
函数调用的求值是无副作用的,如果在调用期间按序执行的所有存储操作都是与该调用同步的对象的修改;若该操作是可观察的,则对该对象的所有访问必须基于函数的唯一指针参数。
幂等性
若对 E 的二次求值可在原始求值后立即进行序列化,且不改变其最终值(若存在)或执行过程的可观测状态,则称该求值 E 具有幂等性。
无状态
当函数 F 或其调用函数中,所有静态或线程 存储期 对象的定义均为 const 限定但非 volatile 限定时,该函数 F 即为无状态函数。
Independent
当函数 F 满足以下条件时,该函数是独立的:对于任何通过非基于调用参数的左值被 F 调用所观察到的对象 X ,在同一程序执行期间所有对 F 的调用中对 X 的所有访问都观察到相同的值;否则,若访问基于指针参数,则必须存在唯一的指针参数 P ,使得对 X 的任何访问都是基于 P 的左值。
当对象 X 在函数调用中被观测时,需同时满足以下条件:两者实现同步、 X 非该调用的局部对象、 X 的生命周期始于函数调用之前,且在调用期间对 X 的访问被顺序执行;在此调用前存储的 X 的最后一个值(若存在)即称为该调用所观测到的 X 值。
注释
这些属性存在的目的是为了编译器优化。
如果函数具有可重现性,多次后续调用可被视为单次调用。
如果函数是无序的,多个后续调用可被视为单个调用,且这些调用可以任意并行化和重排序。