首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__builtin_trap:什么时候使用它?

__builtin_trap:什么时候使用它?
EN

Stack Overflow用户
提问于 2016-03-01 22:19:56
回答 2查看 15.8K关注 0票数 22

gcc为“优化”提供了额外的内置功能。

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

从医生那里:

__builtin_trap函数导致程序异常退出。GCC通过使用目标依赖机制(例如故意执行非法指令)或调用abort来实现此功能。所使用的机制可能因版本而异,因此您不应依赖任何特定的实现。

为什么要使用这个而不是exit(1)abort呢?为什么gcc的开发者把这个看作是一个优化函数呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-01 22:25:23

因为exit(1)会导致程序以错误状态代码正常终止。见the首选项页面。相反,__builtin_trap会导致程序异常终止。

看到差异的最简单的方法是查看exit所做的保证,如果做其中一件事是您不希望发生的事情,__builtin_trap会更好。

调试是最常见的例子,因为__builtin_trap可能触发调试器来转储进程,而exit则不会(因为程序“正常”地以错误终止)。

票数 13
EN

Stack Overflow用户

发布于 2016-03-01 22:47:24

__builtin函数不一定用于优化--它们用于“做编译器不能直接从源代码中执行的事情”,包括对“特殊指令”和“特定于体系结构的操作”的支持。__builtin函数的主要目的之一是编译器将在稍后阶段“知道”这些函数所做的事情。尽管编译器中存在“库优化”,但编译器可以更自由地使用__builtin函数来确定行为是否是特定的--例如,可以依赖__builtin_trap来“不继续执行下一条指令”,因此编译器不必担心这样的代码:

代码语言:javascript
复制
if (x <= 0.0) __builtin_trap();
y = ln(x);

然后,它可以使用“快速内联版本的ln",因为错误已经被捕获。

还请注意,__builtin_trap几乎可以保证在调试器中以“停止”的形式结束,在调试器中,exit(1)或其他类似的程序将使用“不成功”的结果代码退出程序,如果您试图找出数学错误消息的来源,这是相当恼人的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35734759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档