非ローカルジャンプ(setjmp
、longjmp
)を使用しています。公演で問題になるのではないかと思います。すべてのスタックを保存しますかsetjmp
、それとも一部のポインターだけを保存しますか?
ありがとう。
setjmp
longjmp
が呼び出されたときにプログラムが実行を継続するために十分な情報を保存する必要があります。これは通常、現在のスタックポインターと、計算に影響を与える可能性のある他のCPUレジスタの現在の値で構成されます。
これが「パフォーマンスの問題」を引き起こすかどうかについてはコメントできません。何と比較したいかわからないからです。
簡単な答えは次のとおりです。可能性は低いです。あなたのプログラムで目立ったボトルネックになった場合setjmp
、私はあなたのプログラムのデザインをオーバーホールする必要があると言う傾向があります。
イェンスが言ったように、それが目立ったボトルネックになった場合は、それsetjmp
が使用されることになっている方法ではないので、それを再設計します。
あなたの質問に関して:
これはおそらくあなたがあなたのプログラムを実行しているアーキテクチャと正確にあなたのコードでコンパイラが何をするかに依存します。ARMでは、goto
おそらく非常に高速な単一の分岐命令に変換されます。一方、ジャンプ後に実行を再開するには、すべてのレジスタを保存して復元する必要がありますsetjmp
。longjmp
NEONをサポートするARMv7-aでは、これには約16個の32ビットレジスタと最大16個の128ビットレジスタを保存する必要があります。これは、単純なブランチと比較してかなりの余分な作業です。
x86で必要な作業が少ないかどうかはわかりませんが、x86goto
の方がはるかに安いと思います。