相关疑难解决方法(0)

什么是尾部呼叫优化?

很简单,什么是尾部调用优化?更具体地说,任何人都可以显示一些可以应用的小代码片段,而不是在哪里,并解释为什么?

language-agnostic algorithm recursion tail-recursion tail-call-optimization

765
推荐指数
8
解决办法
15万
查看次数

这是无限递归UB吗?

在C++ 11中,作为一个没有副作用的无限循环,以下程序是UB:

int main() {
   while (true) {}
}
Run Code Online (Sandbox Code Playgroud)

UB也是以下吗?

void foo() {
   foo();
}

int main() {
   foo();
}
Run Code Online (Sandbox Code Playgroud)

两个计划的标准引文都是理想的.

c++ recursion undefined-behavior c++11

24
推荐指数
1
解决办法
1226
查看次数

为什么(无限)递归在 clang(和 gcc/g++)中使用 和 w/o -O3 会给出不同的结果?

当我编译并运行此代码时

#include <stdio.h>

int collatz(int a) {
    return a == 1 ? 1 : collatz((a%2) ? 3*a+1 : a/2);
}

int main() {
    for (int a = 0; a < 10; ++a)
        printf("%d: %d\n", a, collatz(a));
}
Run Code Online (Sandbox Code Playgroud)

clang(10.0.0-4ubuntu1)中它崩溃了,但是当我添加-O3它时它运行良好。(当将此作为 C 或 C++ 代码传递给clang.)

我知道它在没有优化标志的情况下崩溃,因为collatzwith的调用0将导致无限递归。但是,随着-O3它返回0: 1,这是错误的。这是优化中的(已知)错误还是我遗漏了什么?

gcc/ g++(9.3.0) 不优化也崩溃,编译挂起-O3。)

编辑:只是补充一点,我不是在寻找程序挂起/失败的原因(这很清楚),而是为什么编译器显然可以自由返回一些值而程序不应返回(但进入无限循环)。

编辑 2:为什么我没有选择一个更小的例子?嗯,在这里,这给出了相同的行为

int divide(int i) {
  return i == 1 ? …
Run Code Online (Sandbox Code Playgroud)

c c++ clang compiler-optimization

5
推荐指数
1
解决办法
203
查看次数