首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用goto逃逸控制结构会产生不同的装配吗?

使用goto逃逸控制结构会产生不同的装配吗?
EN

Stack Overflow用户
提问于 2015-06-02 16:16:40
回答 1查看 96关注 0票数 1

关于goto命令有很多争论,这个问题不是它使用的正确与否,而是一个更简单的问题,它是否真的创建了不同的程序集。

我特别关注的是Visual 2013,但是在任何编译器中都有一个很好的例子。

Bjarne Stroustrup态

标签的范围是它所包含的功能(第6.3.4节)。这意味着您可以使用goto跳入或跳出块。唯一的限制是不能跳过初始化程序或异常处理程序(§13.5)。 在普通代码中,goto的少数几种合理的用法之一是从嵌套循环或switch-statement中分离出来。

那么,我的问题是:在任何情况下,goto 仍然产生与使用其他控制结构所能完成的不同的程序集吗?

例如,这会产生相同的程序集:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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++;
EN

回答 1

Stack Overflow用户

发布于 2015-06-02 16:32:38

下面是我的经验:我曾经有过一段时间非常关键的代码。它有一个循环,平均迭代0次(但(条件).)而且这种情况几乎总是假的。编译器坚持循环优化,将东西移出循环之外--即使根本没有执行循环,因此减慢了循环速度。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30601331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档