为何C2X标准有[[noreturn]]属性却未引入[[always_return]]属性?
既然C2X标准(文档编号n3301)中存在
[[noreturn]]属性,为何没有引入[[always_return]]属性? [[always_return]]的语义可定义如下:
被
[[always_return]]属性修饰的函数必须始终返回至调用者。
引入[[always_return]]的目的是为编译器提供优化提示。
示例(摘自文档N3128):
extern void g(int x); int f(int a, int b) { g(b ? 42 : 43); return a / b; }
编译器可以(乐观地)假设未定义行为(UB)不会发生,但只有当UB在抽象机层面的执行中实际发生时,才会产生不良后果。
在本示例中,g可能会终止程序(即不返回)。因此,编译器不能将b ? 42 : 43折叠为42——因为在抽象机层面a / b可能不会被执行,编译器也就不能假设b非零。
但如果g被[[always_return]]修饰,那么编译器就可以将b ? 42 : 43折叠为42,因为抽象机层面a / b一定会被执行,编译器可以假设b非零。
附:同样的问题也适用于[[may_return]]属性。
更新:要将b ? 42 : 43折叠为42,g不仅要始终返回,还不能有可观察行为(OB)。这是因为在C语言中,OB必须在UB之前发生。因此可能还需要更多属性:[[observable]]和[[noobservable]]。此时g的声明可以是:
extern [[always_return]] [[noobservable]] void g(int x);
内容的提问来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

