永不返回函数的 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/