Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无限循环在C++;如果它调用共享库?_C++_Infinite Loop_Undefined Behavior - Fatal编程技术网

C++ 无限循环在C++;如果它调用共享库?

C++ 无限循环在C++;如果它调用共享库?,c++,infinite-loop,undefined-behavior,C++,Infinite Loop,Undefined Behavior,据说(;;)的无限循环是未定义的行为 从 在一个有效的C++程序中,每个线程最终都会执行一个 以下: 终止 调用I/O库函数 读取或修改易失性对象 执行原子操作或同步操作 没有一个执行线程可以不执行任何 这些可观察到的行为 请注意,这意味着一个具有无穷递归或无穷循环的程序 循环(无论是作为for语句实现还是通过循环goto或 否则)具有未定义的行为 但如果它调用共享库中的函数呢 (;;)sofunc()的 该函数可以执行任何类型的阻塞I/O,或引发异常 在这种情况下,编译器是否假设循环具

据说(;;)的无限循环
是未定义的行为


在一个有效的C++程序中,每个线程最终都会执行一个 以下:

  • 终止
  • 调用I/O库函数
  • 读取或修改易失性对象
  • 执行原子操作或同步操作
没有一个执行线程可以不执行任何 这些可观察到的行为

请注意,这意味着一个具有无穷递归或无穷循环的程序 循环(无论是作为for语句实现还是通过循环goto或 否则)具有未定义的行为


但如果它调用共享库中的函数呢

(;;)sofunc()的

该函数可以执行任何类型的阻塞I/O,或引发异常


在这种情况下,编译器是否假设循环具有一些可观察的行为?

在许多地方,标准语言为编译器提供了超出有用优化所需的自由,但这反而为编译器提供了将最小惊讶原则抛出窗外的方法。关于无止境循环的规则的编写方式符合这一类别

关于无止境循环的规则将促进大多数优化,这些优化将通过指定执行一段代码所需的时间(即使是无限的)不被认为是编译器需要保留的副作用的语言来实现。这样的规则允许编译器省略任何没有任何直接副作用的循环迭代,并且不修改其他地方使用的值

然而,标准超出了这一范围。鉴于代码:

int foo(void)
{
  int x=0;
  do
  {
    x=functionWithNoSideEffects(x);
  } while(x != 23 && x != 42);
  return x;
}
一个能够显示具有NosideEffects的函数的编译器永远不会 任何定义的副作用和永远不会返回23都可以将“foo”的代码替换为“return 42;”。即使程序的目的是测试具有Nosideeffects的函数是否会返回42(在这种情况下,生成的代码返回42,无论函数是否返回都是没有帮助的),标准也不会要求编译器生成代码来实际测试,除非循环包含某种“副作用”

我个人并不认为有这样一条规则的价值 如果编译器可以显示循环不能在X为真的情况下终止,那么它们 可能认为X是真的,不管是否有任何方法
可以是。然而,基于该原则的优化似乎很流行。

如果
sofunc
不执行指定的操作之一,则说明程序无效。我不知道有哪种编译器、操作系统或CPU会因为使用空的非结束循环或调用函数的非结束循环而导致任何问题。在标准世界之外,这个问题是荒谬的。我对OP没有任何要求,我只是觉得这不是一个真正的计划issue@DavidHaim--未定义的行为只意味着语言定义没有告诉您程序应该做什么。询问应用的限制并不荒谬。无限循环是定义良好的行为。将执行转移到函数并返回是一种定义良好的行为。共享库不在本标准的范围内,因此本标准对它们只字不提。为什么
23
?不是吗?@wallyk:我调整了这个例子,使它更有趣一些。你更喜欢吗?肯定是进步了。但我认为只有一个答案。