我正在使用非本地跳转(setjmp
,longjmp
)。我想知道它是否会成为表演的问题。 setjmp
是保存所有堆栈还是只保存一些指针?
感谢。
答案 0 :(得分:2)
setjmp
必须保存足够的信息,以便程序在调用longjmp
时继续执行。这通常包括当前堆栈指针,以及可能影响计算的任何其他CPU寄存器的当前值。
我无法评论这是否会导致“性能问题”,因为我不知道你想要将它与之比较。
答案 1 :(得分:2)
快速回答是:不太可能。如果setjmp
在您的计划中成为明显的瓶颈,我倾向于说您的计划设计需要进行大修。
答案 2 :(得分:1)
就像Jens所说,如果它成为一个明显的瓶颈,重新设计它,因为这不是setjmp
应该如何使用。
关于你的问题:
这可能取决于您运行程序的架构以及编译器对您的代码执行的操作。在ARM上,goto
可能被翻译成单个分支指令,速度非常快。另一方面,setjmp
和longjmp
需要保存和恢复所有寄存器,以便在跳转后恢复执行。在支持NEON的ARMv7-a上,这需要保存大约16个32位寄存器和最多16个128位寄存器,与简单的分支相比,这是一项额外的工作。
我不知道x86上是否需要更少的工作,但我怀疑goto
在那里也便宜得多。