从http://en.cppreference.com/w/cpp/language/memory_model
In a valid C++ program,every thread eventually does one of the
following:
- terminate
- makes a call to an I/O library function
- reads or modifies a volatile object
- performs an atomic operation or a synchronization operation
No thread of execution can execute forever without performing any of
these observable behaviors.Note that it means that a program with endless recursion or endless
loop (whether implemented as a for-statement or by looping goto or
otherwise) has undefined behavior.
for(;;)sofunc();
该函数可以做任何类型的阻塞I / O,或抛出异常.
在这种情况下,编译器是否假设循环有一些可观察的行为?
解决方法
由无限循环的规则促成的大部分优化将由语言启用,该语言规定执行代码段所需的时间(即使是无限的)不被认为是编译器需要的副作用保留.这样的规则将允许编译器省略任何不具有任何直接副作用的循环迭代,并且不修改其他地方使用的值.
然而,“标准”超出了这一标准.给出代码:
int foo(void) { int x=0; do { x=functionWithNoSideEffects(x); } while(x != 23 && x != 42); return x; }
一个可以显示functionWithNoSideEffects永远不会有的编译器
任何定义的副作用,永远不会返回23可以用“return 42;”代替“foo”的代码.即使程序的目的是测试functionWithNoSideEffects是否会返回42(在这种情况下,生成的代码返回42函数是否有效)将不会要求编译器生成代码来实际测试,除非循环包括某种“副作用”.
我不相信有一个规则说的价值如果编译器可以显示一个循环不能终止,而X不为真可以认为X是真实的,无论是否有任何手段可能.然而,基于这一原则的优化似乎很受欢迎.