noreturn
属性は決して返されない関数に必要ですか、これはちょうど(おそらく時期尚早ですか? - 少なくとも出口については、私はそこで最適化する理由を想像できません)最適化ですか?終了関数のnoreturn属性は必要ですか?
このような
void myexit(int s) _Noreturn {
exit(s);
}
// ...
if (!p) { myexit(1); }
f(*p);
/// ...
noreturn
などのコンテキスト内で最適化されてから!p
枝を防止することを私に説明しました。 しかし、コンパイラがその分岐を最適化することは本当に許されていますか? p
== NULL
の場合、逆参照はUBなので、p
はこのコンテキストではNULL
になることはありません。したがって、!p
ブランチはトリガしません。」というメッセージが表示されることがあります。しかし、コンパイラは、myexit
が(明示的にそのようにマークされていなくても)返されない関数であると仮定することによって問題を解決することはできませんか?
私はC++にマークを付けることを躊躇しています。しかし、C++にはnoreturn属性( '' [noreturn] ')もあり、C/C++の答えが大歓迎です。 – PSkocik
_ "noreturnは'!p'ブランチが最適化されないようにします。 " – mvidelgauz
可能な複製 - http://stackoverflow.com/questions/10538291/what-is-the-point-of-noreturn – mvidelgauz