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