gcc提供了"用于优化"的其他内置函数.
其中之一就是void __builtin_trap (void)通过执行非法命令来中止程序.
来自doc:
__builtin_trap函数导致程序异常退出.GCC通过使用依赖于目标的机制(例如故意执行非法指令)或通过调用abort来实现此功能.使用的机制可能因版本而异,因此您不应依赖任何特定实现.
为什么你会永远使用此,而不是exit(1)或abort?为什么gcc开发人员将此视为优化功能?
因为exit(1)导致程序正常终止并带有错误状态代码.请参阅cppreference页面.相反,__builtin_trap导致程序异常终止.
看待差异的最简单方法是查看所做的保证exit,如果做其中一件事你不想发生,__builtin_trap那就更好了.
调试是最常见的示例,因为__builtin_trap可能触发调试器转储进程,而exit不会(因为程序"正常"终止并出现错误).
这些__builtin函数不一定是为了优化 - 它们是为了“做编译器无法直接从源代码做的事情”,包括支持“特殊指令”和“特定于体系结构的操作”。函数的主要目的之一__builtin是编译器将“知道”它们在稍后阶段的作用。尽管编译器中有“库优化”,但编译器可以__builtin更自由地使用函数来确定行为是否特定 - 例如,__builtin_trap可以依赖“不继续下一条指令”,因此编译器不会'不必担心像这样的代码:
if (x <= 0.0) __builtin_trap();
y = ln(x);
Run Code Online (Sandbox Code Playgroud)
然后它可以使用“快速内联版本ln”,因为错误已经被捕获。
另请注意,__builtin_trap几乎肯定会在调试器中以“停止”的形式结束,其中exit(1)或某些此类内容将仅以“不成功”结果代码退出程序,如果您试图弄清楚数学在哪里,这是相当烦人的错误消息来自...