gcc为“优化”提供了额外的内置功能。
其中之一是void __builtin_trap (void),它本质上是通过执行一个非法命令来中止程序。
从医生那里:
__builtin_trap函数导致程序异常退出。GCC通过使用目标依赖机制(例如故意执行非法指令)或调用abort来实现此功能。所使用的机制可能因版本而异,因此您不应依赖任何特定的实现。
为什么要使用这个而不是exit(1)或abort呢?为什么gcc的开发者把这个看作是一个优化函数呢?
发布于 2016-03-01 22:25:23
因为exit(1)会导致程序以错误状态代码正常终止。见the首选项页面。相反,__builtin_trap会导致程序异常终止。
看到差异的最简单的方法是查看exit所做的保证,如果做其中一件事是您不希望发生的事情,__builtin_trap会更好。
调试是最常见的例子,因为__builtin_trap可能触发调试器来转储进程,而exit则不会(因为程序“正常”地以错误终止)。
发布于 2016-03-01 22:47:24
__builtin函数不一定用于优化--它们用于“做编译器不能直接从源代码中执行的事情”,包括对“特殊指令”和“特定于体系结构的操作”的支持。__builtin函数的主要目的之一是编译器将在稍后阶段“知道”这些函数所做的事情。尽管编译器中存在“库优化”,但编译器可以更自由地使用__builtin函数来确定行为是否是特定的--例如,可以依赖__builtin_trap来“不继续执行下一条指令”,因此编译器不必担心这样的代码:
if (x <= 0.0) __builtin_trap();
y = ln(x);然后,它可以使用“快速内联版本的ln",因为错误已经被捕获。
还请注意,__builtin_trap几乎可以保证在调试器中以“停止”的形式结束,在调试器中,exit(1)或其他类似的程序将使用“不成功”的结果代码退出程序,如果您试图找出数学错误消息的来源,这是相当恼人的。
https://stackoverflow.com/questions/35734759
复制相似问题