C++26: Trivial infinite loops are no longer undefined behaviour
a day ago
- 在C++26之前,一个没有副作用的 while(true); 循环在C++中是未定义行为,而在C中这样的循环是良定义的。
- 像Clang这样的编译器可能会优化掉无限循环,导致执行流程落入后续代码,从而产生意外行为,例如从不可达的函数中打印'Hello world!'。
- 这种未定义行为对于采用 while(true); 循环实现错误时停机的嵌入式代码和内核代码来说是有问题的。
- C++26通过提案P2809R3修复了这个问题,该提案将'平凡无限循环'定义为具有空循环体和常量true条件的循环。
- 现在,平凡无限循环被替换为对 std::this_thread::yield() 的调用,从而赋予它们良定义的向前进展语义。
- 独立实现可以决定是否进行yield()替换,这对于裸机系统很重要。