__builtin_trap:何时使用它?

时间:2016-03-01 22:19:57

标签: c++ gcc built-in

gcc提供了“用于优化”的其他内置函数。

其中一个是void __builtin_trap (void),它实质上是通过执行非法命令来中止程序。

来自doc:

  

__ builtin_trap函数导致程序异常退出。 GCC实现了这一点   通过使用依赖于目标的机制(例如故意的)来发挥作用   执行非法指令)或通过调用abort。机制   使用可能因版本而异,因此您不应该依赖任何版本   具体实施。

为什么要使用此而不是exit(1)abort?为什么gcc开发人员将此视为优化函数?

2 个答案:

答案 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;结果代码,如果你想弄清楚数学错误信息来自哪里,那就相当烦人了......