非本地跳转是否存在性能问题?

时间:2012-04-28 13:04:37

标签: c longjmp setjmp

我正在使用非本地跳转(setjmplongjmp)。我想知道它是否会成为表演的问题。 setjmp是保存所有堆栈还是只保存一些指针?

感谢。

3 个答案:

答案 0 :(得分:2)

setjmp必须保存足够的信息,以便程序在调用longjmp时继续执行。这通常包括当前堆栈指针,以及可能影响计算的任何其他CPU寄存器的当前值。

我无法评论这是否会导致“性能问题”,因为我不知道你想要将它与之比较。

答案 1 :(得分:2)

快速回答是:不太可能。如果setjmp在您的计划中成为明显的瓶颈,我倾向于说您的计划设计需要进行大修。

答案 2 :(得分:1)

就像Jens所说,如果它成为一个明显的瓶颈,重新设计它,因为这不是setjmp应该如何使用。

关于你的问题:
这可能取决于您运行程序的架构以及编译器对您的代码执行的操作。在ARM上,goto可能被翻译成单个分支指令,速度非常快。另一方面,setjmplongjmp需要保存和恢复所有寄存器,以便在跳转后恢复执行。在支持NEON的ARMv7-a上,这需要保存大约16个32位寄存器和最多16个128位寄存器,与简单的分支相比,这是一项额外的工作。

我不知道x86上是否需要更少的工作,但我怀疑goto在那里也便宜得多。