加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:48:59 所属栏目:百科 来源:网络整理
导读:这就是(;;)的无限循环是未定义的行为. 从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 vo
这就是(;;)的无限循环是未定义的行为.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读