1. ホーム
  2. language-agnostic

[解決済み】ループや関数をサポートする言語で「goto」の正当な使用例はあるのか?

2022-04-11 19:20:14

質問

私は長い間、次のような印象を抱いていました。 goto は、可能な限り使用しないでください。

しかし、先日、(C言語で書かれた)libavcodecを熟読していたところ、複数の使い方があることに気づき、驚きました。

を使用することが有利になることはありますか? goto ループや関数をサポートする言語では? もしそうなら、なぜですか? ループや関数の使用を明確に正当化する具体的な例を挙げてください。 goto .

解決方法は?

私が知っている限りでは、"goto"文を使う理由はいくつかあります(すでにお話されている方もいらっしゃいますが)。

関数をきれいに終了させる

関数内ではしばしば、リソースを割り当て、複数の場所で終了する必要がある場合があります。 プログラマーは、関数の最後にリソースのクリーンアップコードを置くことで、コードを簡素化することができ、関数のすべての "exit points" はクリーンアップラベルをゴーイングします。 このようにすれば、関数のすべての"exitポイント"でクリーンアップコードを書く必要がなくなります。

ネストしたループの終了

ネストされたループの中にいて、そこから抜け出す必要がある場合 すべて を使えば、break 文や if-check よりもずっとすっきりしてシンプルになります。

低レベルのパフォーマンス改善

これは、パフォーマンスが重要なコードにおいてのみ有効ですが、goto文は非常に高速に実行され、関数内を移動する際にブーストを与えることができます。 しかし、これは諸刃の剣で、コンパイラは通常gotoを含むコードを最適化することができないからです。

これらの例では、ゴトは一つの関数の範囲に限定されていることに注意してください。