1

このコマンドについては多くの議論がありますgoto。この問題は、その使用の正誤に関するものではなく、より単純に、実際に別のアセンブリを作成するかどうかの問題です。

私は特に Visual Studio 2013 を検討していますが、どのコンパイラの例も素晴らしいでしょう。

Bjarne Stroustrup は次のように述べています

ラベルのスコープは、それが含まれる機能です (§6.3.4)。これは、 を使用gotoしてブロックに飛び込んだり、ブロックから飛び出したりすることができることを意味します。唯一の制限は、イニシャライザまたは例外ハンドラを飛び越えることができないことです (§13.5)。
通常のコードでの数少ない賢明な使用法の 1 つはgoto、ネストされたループまたはswitchステートメントから抜け出すことです。

私の質問:goto他の制御構造を使用して既に達成できるものとは異なるアセンブリをまだ生成するインスタンスはありますか?

たとえば、これは同一のアセンブリを生成します。

auto r = rand();
auto a = 0;

for(auto i = rand(); i > 0; --i){
    switch(r){
    case 1:
        ++sum;
        goto END;
    case default:
        sum += rand();
        break;
    }
}
sum++;
END:

この非gotoコードに:

auto r = rand();
auto b = false;
auto a = 0;

for(auto i = rand(); i > 0; --i){
    switch(r){
    case 1:
        ++sum;
        b = true;
        break;
    case default:
        sum += rand();
        break;
    }
    if(b)break;
}

if(!b)sum++;
4

1 に答える 1

1

これが私の経験です: 私はかつて、非常に時間が重要なコードを少し持っていました。そして、平均ゼロ回 (while (条件) ...) を繰り返すループがあり、条件はほとんどの場合 false でした。コンパイラは、ループの最適化を主張し、ループがまったく実行されていない場合でも、物事をループの外に移動したため、ループが遅くなりました。

オプティマイザーを混乱させてコードの最適化をあきらめることを期待して、goto を使用してループを書き直そうとしましたが、失敗しました。gcc と clang は、使用する C または C++ コードではなく、実際の制御フローに応じて最適化します。

于 2015-06-02T16:32:38.883 に答える