主要观点:讨论编译器优化与终止分析的冲突,通过不同的 C 代码示例展示编译器对无限循环的处理及相关问题,如一些编译器在优化时会终止本应无限循环的代码,而部分编译器能正确处理;还涉及费马大定理相关代码及编译器对其的处理等。
关键信息:
- 用不同方式写无限循环,多数优化编译器能识别并相应生成代码,如
while (1) { }
和for (;;) { }
。 - 为让编译器不理解循环为无限,写了特殊的无限循环代码,涉及费马大定理的特殊情况,当优化开启时,一些编译器会允许其终止。
- 不同编译器(如 LLVM/Clang、Open64-x86、Sun CC、Intel CC 等)在处理相关代码时表现不同,部分会终止本应无限的循环,部分能正确处理。
- 微软编译器也有终止相关代码的 bug,Visual Studio 2008 和 2010 均如此。
- 对关于此问题的一些疑问进行了回答,如是否真的重要、编译器是否应进行终止分析等。
重要细节: - 给出具体的 C 代码示例,包括无限循环代码、涉及费马大定理的代码等。
- 展示不同编译器对这些代码的处理结果,如生成的汇编代码等。
- 解释编译器在处理代码时的选择倾向,即更注重速度而非正确性。
- 提及费马大定理的相关信息,如 n=3 的特殊情况的证明时间等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。