C++程序的终止是否可观察到?

13

我也可以这样表达:什么构成了可观察行为?

C++标准经常谈论可观察行为,但我不确定程序终止是否是可观察行为的一部分。

也就是说,考虑下面这个程序:

int main() {
  for(;;) {}
  return 0;
}

符合规范的实现是否允许终止此程序?


这个例子和已有的答案只考虑了符合规范的实现是否允许终止非终止程序。但我认为应该考虑相反的情况:符合规范的实现能否不终止已终止的程序? - xskxzr
2个回答

6
对于上述代码,编译器生成一个空的主体是合法的(因此几乎立即终止)。
C++0x FCD第6.5节说(特别注意注释):

循环,在for语句的for-init-statement之外,
*不调用库I/O函数,并且
*不访问或修改易失性对象,并且
*执行没有同步操作(1.10)或原子操作(29条)

可以假定实现将终止。[注意:这旨在允许编译器进行转换,例如删除空循环,即使无法证明终止。 — 结束注释]

因此,编译器可以假定您的for循环终止,并且由于主体为空,它可以完全优化掉。
草案中的引文是从这个问题复制过来的,并且已经和我的副本进行了核对。

2

C++程序的终止是否是可观察行为?

是的,程序执行结束是一种可观察行为,因为程序会返回一个错误代码。

  • 当没有错误时返回0
  • 当不成功时返回非0值

正常的终端不显示这些状态,这就是为什么你看不到它们。

符合规范的实现是否允许终止该程序?

程序不能退出,但根据不同的操作系统,它可以被终止,例如信号、中断等。

--编辑--

第二个问题的答案有点错误

正如Martin和Motti在之前的回答中解释的那样:

讨论基于编译器可以安全执行的允许优化。由于明确允许删除死循环,因此编译器可以自由地丢弃上面的循环,从而允许程序终止


@Fred Nurk:谢谢链接。但在我看来,它似乎取决于编译器如何解释/优化它,是吗?顺便说一下:看起来你的链接指向一个关于草案的问题,那么这是否意味着它还没有确定? - Phong
1
讨论基于编译器可以安全执行的允许优化。由于明确允许删除死循环,因此编译器可以自由地丢弃上述循环,从而允许程序终止。附注:您在此处找到的所有链接都指向规范的草案版本。任何非草案版本均不免费。 - Martin York
@Martin:谢谢你的解释,我会编辑我的回答。看起来相当危险... - Phong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接