关于goto命令有很多争论,这个问题不是它使用的正确与否,而是一个更简单的问题,它是否真的创建了不同的程序集。
我特别关注的是Visual 2013,但是在任何编译器中都有一个很好的例子。
标签的范围是它所包含的功能(第6.3.4节)。这意味着您可以使用
goto跳入或跳出块。唯一的限制是不能跳过初始化程序或异常处理程序(§13.5)。 在普通代码中,goto的少数几种合理的用法之一是从嵌套循环或switch-statement中分离出来。
那么,我的问题是:在任何情况下,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++;发布于 2015-06-02 16:32:38
下面是我的经验:我曾经有过一段时间非常关键的代码。它有一个循环,平均迭代0次(但(条件).)而且这种情况几乎总是假的。编译器坚持循环优化,将东西移出循环之外--即使根本没有执行循环,因此减慢了循环速度。
我试着用goto重写循环,希望把优化器搞混,放弃优化代码,但失败了。gcc和clang根据实际的控制流进行优化,而不是取决于您使用的C或C++代码。
https://stackoverflow.com/questions/30601331
复制相似问题