如果调用共享库,C中是无限循环还是未定义的行为?
这就是(;;)的无限循环是未定义的行为.
从http://en.cppreference.com/w/cpp/language/memory_model
但是如果它在共享库中调用函数怎么办? for(;;)sofunc(); 该函数可以做任何类型的阻塞I / O,或抛出异常. 在这种情况下,编译器是否假设循环有一些可观察的行为? 解决方法
有许多地方,“标准”的语言使编译器的自由超出了有用的优化所需要的自由度,但是这样可以为编译者提供将“最低惊悚原则”抛出窗外的方法.无限循环的规则写入的方式适合该类别.
由无限循环的规则促成的大部分优化将由语言启用,该语言规定执行代码段所需的时间(即使是无限的)不被认为是编译器需要的副作用保留.这样的规则将允许编译器省略任何不具有任何直接副作用的循环迭代,并且不修改其他地方使用的值. 然而,“标准”超出了这一标准.给出代码: int foo(void) { int x=0; do { x=functionWithNoSideEffects(x); } while(x != 23 && x != 42); return x; } 一个可以显示functionWithNoSideEffects永远不会有的编译器 我不相信有一个规则说的价值如果编译器可以显示一个循环不能终止,而X不为真可以认为X是真实的,无论是否有任何手段可能.然而,基于这一原则的优化似乎很受欢迎. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |