c - 为什么 Valac 在 C 代码中生成这些(无意义的?)临时指针

标签 c compilation compiler-optimization vala

我开始研究 Vala,现在我不明白为什么在这些示例中创建变量 tmp1 如果可以立即使用 tmp0? enter image description here 与此处的 tmp1 tm3 相同 enter image description here

我稍微阅读了文档,但不明白为什么 valac 会生成这些临时指针。 https://wiki.gnome.org/Projects/Vala/Hacking#Documentation

我真的很想了解 Vala 编译器是如何工作的。现在我认为它在很大程度上依赖于 gcc 中使用 -O3 进行的优化,显然它是默认包含的。我尝试使用和不使用 -O3 标志进行编译,二进制文件的权重是相同的。

最佳答案

主要是为了避免未定义的行为。在 C 语言中,计算参数的顺序是未定义的。例如,如果你有类似的东西

int x = 1;
foo(x++, x++);

您可以调用 foo(1, 2)foo(2, 1)

在Vala中,顺序是有定义的;它将是 foo(1, 2)。为此,Vala 有时需要使用临时变量,所以代码变成了这样的:

int x = 1;
int tmp0 = x++;
int tmp1 = x++;
foo(tmp0, tmp1);

为了使代码生成器保持简单,总是生成临时变量。

任何 C 编译器都会很容易地优化临时变量(你不需要 -O3-O1 就足够了),所以没有没有太多理由更改 valac 来消除临时变量。唯一真正的缺点是生成的代码有点难看。

关于c - 为什么 Valac 在 C 代码中生成这些(无意义的?)临时指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54058529/

相关文章:

c - 神秘的 linux 回溯和内存映射

C++ 模板函数无法将 'std:string' 转换为 'double' 作为返回

java - 运行时多态性决定

java - 错误 : main class not found

编译输出代码

performance - 难以理解和比较 CPU 性能指标

c - 使用函数将角度从度数转换为 C 中的弧度

c - 如何使用 connect() 获取内核分配给 UDP 套接字的本地地址?

c: strtod:双指针与对单指针的引用

c++ - 对 __cxa_throw_bad_array_new_length (g++ 7.4) 的 undefined reference