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

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

可以优化编译器删除无限循环,这不会改变任何数据,如

while(1) 
  /* noop */;

从分析编译器可以推导出的数据流图,这样的循环是“死代码”而没有任何副作用。

是否删除了C90 / C99标准禁止的无限循环?

C90或C99标准是否允许编译器删除此类循环?

更新:“Microsoft C版本6.0基本上做了这个优化。”,请参阅caf的链接。

label: goto label;return 0;

将转变为

return 0;


米琪卡哇伊
浏览 685回答 3
3回答

泛舟湖上清波郎朗

普遍无法检测无限循环:请参阅暂停问题。因此,任何编译器都可以做的最好的事情是采取一个不错的猜测 - 例如OP中提到的明显情况。但为什么这会是可取的呢?我可以看到发出警告并仍然允许行为,但是删除循环不是“优化” - 它改变了程序的行为!

繁星coding

循环不是死代码,它基本上阻止程序达到它后面的任何东西。如果删除循环,则不会发生这种情况,因此编译器无法删除循环。它可能会用平台相关的空闲指令替换它,以通知处理器线程不再执行任何操作。编译器可以做的是删除循环后出现的任何代码,因为它无法访问并且永远不会被执行。
打开App,查看更多内容
随时随地看视频慕课网APP