当前位置: C语言 -- 基础 -- 声明

声明(二十二)

6.1、reproducible类型属性

reproducible类型属性断言:具有该类型属性的函数或者引用的函数是可重现的,即函数无副作用并且是幂等的。reproducible类型属性语法格式如下所示:

[[reproducible]]

reproducible类型属性应出现在函数形参类型列表)符号后,可用于函数声明和函数指针声明。

typedef int Func(int) [[reproducible]];
Func f1;
Func *p1;

int f2(int) [[reproducible]];
int (*p2)(int) [[reproducible]];

如果实现支持ISO/IEC 9899:2024标准,reproducible用作__has_c_attribute表达式操作数时,表达式值为202311L,即__has_c_attribute( reproducible )值为202311L


具有reproducible类型属性的函数连续调用两次返回相同值。

int sum(const int a, const int b) [[reproducible]]
{
  return (a+b);
}

具有reproducible类型属性的函数调用时,抽象状态的修改是允许的,只要这些修改对函数调用不可见,并且不会产生其它副作用;因此函数定义可以使用静态存储期限或者线程存储期限的本地对象来跟踪函数调用的实参,并缓存其返回值。


6.2、unsequenced类型属性

unsequenced类型属性断言:具有该类型属性的函数或者引用的函数是无序的,即函数无状态、无副作用、幂等、并且是独立的。unsequenced类型属性语法格式如下所示:

[[unsequenced]]

unsequenced类型属性应出现在函数形参类型列表)符号后,可用于函数声明和函数指针声明。

typedef int Func(void) [[unsequenced]];
Func f1;
Func *p1;

int f2(void) [[unsequenced]];
int (*p2)(void) [[unsequenced]];

如果实现支持ISO/IEC 9899:2024标准,unsequenced用作__has_c_attribute表达式操作数时,表达式值为202311L,即__has_c_attribute( unsequenced )值为202311L


unsequenced类型属性为这类函数断言了强属性(strong properties),特别允许在不影响抽象机状态的情况下放松了函数调用的某些排序要求;因此此类函数常用于公共子表达式消除(common subexpression elimination)、本地记忆化(local memoization)、惰性评估(lazy evaluation)等优化技术。

具有unsequenced类型属性的函数类型的有效性可能取决于派生函数指针是否逃逸出编译单元。对于具有内部链接的函数,如果没有函数指针逃逸出编译单元,则所有函数调用上下文都是已知的,原则上可以证明不存在库函数调用时传入的实参会触发异常的控制流。对于具有外部链接的函数,这样的证明可能无法实现,因此此类函数仅在能够确保提供的实参不会导致异常时才使用。

unsequenced类型属性并不意味函数是可重入的(reentrant),也不意味函数调用可以并发执行;这是因为具有unsequenced类型属性的函数可以读取或者写入静态存储期限的对象,只要在函数调用结束时没有可见的改变即可。


主要参考资料:

1、ISO/IEC 9899:2024

2、ISO/IEC 9899:2018

3、en.cppreference.com : Declarations

4、en.cppreference.com : Storage-class specifiers

5、wiki.sei.cmu.edu : Use the correct syntax when declaring a flexible array member

6、en.cppreference.com : Atomic types

7、gnu.org : Type Qualifiers

8、en.cppreference.com : restrict type qualifier

9、wiki.sei.cmu.edu : Prefer inline or static functions to function-like macros

10、gnu.org : Inline Function Definitions

11、en.cppreference.com : Attribute specifier sequence

12、open-std.org : Improved Rules for Tag Compatibility(updates N3032)

13、en.cppreference.com : C attribute: fallthrough

14、en.cppreference.com : C attribute: unsequenced, reproducible