关于goto
命令有很多争论,这个问题不是关于它的使用的正确性或错误性,而是更简单的问题是它是否实际上创造了不同的集合。
我特别关注Visual Studio 2013,但任何编译器中的示例都很精彩。
标签的范围是它所在的功能(第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++;
答案 0 :(得分:1)
根据我的经验:我曾经有一些非常时间关键的代码。并且它有一个平均零次迭代的循环(while(条件)......)并且条件几乎总是假的。编译器坚持循环优化,将事物移出循环 - 即使循环根本没有执行,因此减慢了循环速度。
我尝试使用goto重写循环,希望混淆优化器足以放弃优化代码,并且失败了。 gcc和clang根据实际控制流程进行优化,而不是取决于您使用的C或C ++代码。