如果调用共享库,C中是无限循环还是未定义的行为?

前端之家收集整理的这篇文章主要介绍了如果调用共享库,C中是无限循环还是未定义的行为?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这就是(;;)的无限循环是未定义的行为.

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是真实的,无论是否有任何手段可能.然而,基于这一原则的优化似乎很受欢迎.

猜你在找的C&C++相关文章