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