使用转到逃避控制结构是否会产生不同的程序集?

时间:2015-06-02 16:16:41

标签: c++ c conditional goto control-structure

关于goto命令有很多争论,这个问题不是关于它的使用的正确性或错误性,而是更简单的问题是它是否实际上创造了不同的集合。

我特别关注Visual Studio 2013,但任何编译器中的示例都很精彩。

Bjarne Stroustrup states

  

标签的范围是它所在的功能(第6.3.4节)。这意味着您可以使用goto跳入和跳出块。唯一的限制是你不能跳过初始化器或异常处理程序(§13.5)   在普通代码中,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++;

1 个答案:

答案 0 :(得分:1)

根据我的经验:我曾经有一些非常时间关键的代码。并且它有一个平均零次迭代的循环(while(条件)......)并且条件几乎总是假的。编译器坚持循环优化,将事物移出循环 - 即使循环根本没有执行,因此减慢了循环速度。

我尝试使用goto重写循环,希望混淆优化器足以放弃优化代码,并且失败了。 gcc和clang根据实际控制流程进行优化,而不是取决于您使用的C或C ++代码。

相关问题