次のことを述べてSwift Docsでノートがあります:スウィフトの取り扱いSwiftとObj-Cの例外。スタック巻き戻しとは何ですか?なぜスウィフトはそれをしないのですか?
エラーは、キーワードをキャッチし、投げる、トライを使用して、他の言語での例外処理に似ています。 SwiftでのObjective-Cエラーハンドリングを含む多くの言語での例外処理とは異なり、計算コストがかかるプロセスであるコールスタックの巻き戻しは必要ありません。したがって、throwステートメントのパフォーマンス特性はreturnステートメントのパフォーマンス特性に匹敵します。
SwiftとObj-cのコールスタックの解き放つ意味は? Related question hereですが、C++固有です。私はコールスタックが何であるかは知っていますが、巻き戻しの詳細な説明が必要です。
Swiftが呼び出しスタックを巻き戻さない場合、代わりに何をしますか?
これは計算上高価なのはなぜですか?
合計要約:Swiftの例外処理と実行フローをよりよく理解したいと思います。
私が決して得られなかったもの:関数から戻ってくる*巻き戻しをスタックする*。もちろん、ステップバイステップ(別名コールバイコール)。しかし、なぜこれが安価であるのかわかりません。 –
@ AminNegm-Awad実際に性能を測定することは容易ではありません。すべての言語とすべてのコンパイラはわずかに異なるモデルを使用します。例えば、http://stackoverflow.com/questions/13835817/are-exceptions-in-c-really-slowを見ることができます。例外が実際に発生した場合、パフォーマンスへの影響は重要であることに注意してください。通常のプログラムフローに例外を使用しないもう一つの理由。また、例外をまったく使用しないプログラミング言語は、コンパイラによってさらに最適化され、より優れたパフォーマンスにつながります。 – Sulthan
@Sulthanあなたの答えはおかげさまで助けになりましたが、Swiftには、それが返すことができる隠されたparamがあります。これはスタックの巻き戻しとはどう違うのでしょうか? func two()を呼び出すfunc one()を呼び出すと、2つのハンドルのどちらも例外をスローして2つの例外がスローされます。しかし、two()を呼び出す呼び出し後の文は実行されません。スタックを呼び出し側に巻き戻すのではないですか?その後、catchブロック内の呼び出し元の次のステートメントから実行が続行されます。 – Brynjar