为什么Valac用C代码生成这些(无意义的)临时指针

时间:2019-01-06 04:03:21

标签: c compilation compiler-optimization vala

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

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

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

1 个答案:

答案 0 :(得分:1)

主要原因是避免未定义的行为。在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来消除临时变量。唯一真正的缺点是生成的代码有些丑陋。