【发布时间】:2019-09-08 02:51:53
【问题描述】:
没有副作用的无限循环是未定义的行为。请参阅 here 以获取来自 cppreference 的示例。更简单的例子:
int foo() {
while(true) {}
return 42;
}
现在考虑几乎等价的
int bar() {
if (true) return bar();
return 42;
}
这是否也会引发未定义的行为?
或者换种说法:根据语言,无限递归属于哪一类错误?
PS:请注意,我知道运行时的含义:循环原则上可以永远运行,而递归最终会导致堆栈溢出。虽然我主要对编译器对它们做了什么感兴趣。也许是一个相当学术的问题......
【问题讨论】:
-
“循环原则上可以永远运行,而递归最终会导致堆栈溢出。” - 实际上,因为它是UB,它可以做任何事情。由于 as-if 规则,它不必首先在实际硬件上递归。特别是,如果启用了优化,编译器可能会用有效的循环(尾调用优化)替换您的递归示例,即使它有副作用。
-
@ArneVogel 是的,代码是人为设计的,但在实践中,大多数 C++ 代码没有具有非平凡 dtors 的对象,并且大多数时候无法进行尾部优化
-
@ArneVogel 将“原则上”读作“如果不是 ub 会发生什么”
-
@user463035818:我会说如果不是 UB 我会说一个实现应该避免执行任何如果省略循环就不会发生的操作,或者任何操作它将对循环中的任何内容具有不可提升的数据依赖关系,但可能会执行如果省略循环会发生的任何操作,除非或直到它遇到不可提升的数据依赖关系。
标签: c++ loops recursion language-lawyer undefined-behavior