为了账号安全,请及时绑定邮箱和手机立即绑定

编译器是否允许消除无限循环?

编译器是否允许消除无限循环?

C
米琪卡哇伊 2019-08-28 10:46:55
编译器是否允许消除无限循环?可以优化编译器删除无限循环,这不会改变任何数据,如while(1)    /* noop */;从分析编译器可以推导出的数据流图,这样的循环是“死代码”而没有任何副作用。是否删除了C90 / C99标准禁止的无限循环?C90或C99标准是否允许编译器删除此类循环?更新:“Microsoft C版本6.0基本上做了这个优化。”,请参阅caf的链接。label: goto label;return 0;将转变为return 0;
查看完整描述

3 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

普遍无法检测无限循环:请参阅暂停问题。因此,任何编译器都可以做的最好的事情是采取一个不错的猜测 - 例如OP中提到的明显情况。

但为什么这会是可取的呢?我可以看到发出警告并仍然允许行为,但是删除循环不是“优化” - 它改变了程序的行为!


查看完整回答
反对 回复 2019-08-28
?
繁星coding

TA贡献1797条经验 获得超4个赞

循环不是死代码,它基本上阻止程序达到它后面的任何东西。如果删除循环,则不会发生这种情况,因此编译器无法删除循环。

它可能会用平台相关的空闲指令替换它,以通知处理器线程不再执行任何操作。

编译器可以做的是删除循环后出现的任何代码,因为它无法访问并且永远不会被执行。


查看完整回答
反对 回复 2019-08-28
  • 3 回答
  • 0 关注
  • 684 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信