c - 退出函数的 noreturn 属性是否必要?

标签 c language-lawyer c11

永不返回函数的 noreturn 属性是否必要,或者这只是一个(可以说是过早的?——至少对于退出,我无法想象为什么要在那里优化)优化?

有人向我解释说,在诸如

void myexit(int s) _Noreturn {
   exit(s);
}
// ...
if (!p) { myexit(1); } 
f(*p);
/// ...

noreturn 防止 !p 分支被优化掉。 但是编译器真的可以优化那个分支吗? 我意识到优化它的基本原理是:“未定义的行为不会发生。如果 p == NULL,取消引用它是 UB,因此 p 在此上下文中永远不能为 NULL,因此 !p 分支不会触发”。但是编译器不能通过假设 myexit 是一个不返回的函数(即使它没有明确标记为这样)来解决这个问题吗?

最佳答案

这允许进行多项优化。首先,对于调用本身,这可能允许简化设置,不必保存所有寄存器,可以使用 jmp 指令代替 call 或类似指令。那么调用之后的代码也可以优化,因为没有分支回到正常流程。

所以是的,通常 _Noreturn 对编译器来说是一个有值(value)的信息。

但作为对您问题的直接回答,不,这是一个用于优化的属性,因此它不是必需的

关于c - 退出函数的 noreturn 属性是否必要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38431147/

相关文章:

c++ - 为什么使用对象进行编程不被认为是程序性的?

c - 当包含文件不存在时如何优雅地使 CMake 失败?

c - C中的for循环优化

c - 是否允许 C 编译器合并对 volatile 变量的顺序分配?

c++ - C 和 C++ 的某些标准之间的差异

c - 为什么允许多次声明 typedef 标识符?

C程序循环输入

c++ - 缩写类型名称 long long 与 long long int,是否符合标准?

c++ - 使用命名空间会导致名称隐藏吗?

c11 _Generic 添加类型