gcc提供了“用于优化”的其他内置函数。
其中一个是void __builtin_trap (void)
,它实质上是通过执行非法命令来中止程序。
来自doc:
__ builtin_trap函数导致程序异常退出。 GCC实现了这一点 通过使用依赖于目标的机制(例如故意的)来发挥作用 执行非法指令)或通过调用abort。机制 使用可能因版本而异,因此您不应该依赖任何版本 具体实施。
为什么要使用此而不是exit(1)
或abort
?为什么gcc开发人员将此视为优化函数?
答案 0 :(得分:8)
因为exit(1)
导致程序正常终止并带有错误状态代码。见the cppreference page。相反,__builtin_trap
导致程序异常终止。
查看差异的最简单方法是查看exit
所做的保证,如果其中一件事情是您不想发生的事情,__builtin_trap
会更好。< / p>
调试是最常见的示例,因为__builtin_trap
可能会触发调试器转储进程,而exit
则不会(因为程序“正常”终止并出现错误)。
答案 1 :(得分:3)
__builtin
函数不一定用于优化 - 它们用于执行编译器无法直接从源代码执行的操作,包括支持&#34;特殊功能指令&#34;和#34;特定于架构的操作&#34;。 __builtin
函数的主要目的之一是编译器将&#34;知道&#34;这些在后期做了些什么。虽然有&#34;库优化&#34;在编译器中,编译器可以更自由地使用__builtin
函数来确定行为是特定的 - 例如,__builtin_trap
可以依赖于&#34;不继续下一条指令&# 34;,所以编译器不必担心代码如下:
if (x <= 0.0) __builtin_trap();
y = ln(x);
然后它可以使用&{34;快速内联版本的ln
&#34;,因为错误已经被捕获。
另请注意,__builtin_trap
几乎可以保证最终成为&#34;停止&#34;在调试器中,exit(1)
或其中一些只会退出程序,而不是成功&#34;结果代码,如果你想弄清楚数学错误信息来自哪里,那就相当烦人了......