我开始研究Vala,现在我不明白为什么在这些示例中,如果可以立即使用tmp0,则创建变量tmp1? 和这里的tmp1 tm3一样
我稍微阅读了文档,但不明白为什么valac会生成这些临时指针。 https://wiki.gnome.org/Projects/Vala/Hacking#Documentation
我真的很想了解Vala编译器的工作原理。现在,我认为它很大程度上依赖于-O3在gcc中进行的优化,显然它是默认包含的。我尝试使用-O3标志(不使用-O3标志)进行编译,并且二进制文件的权重相同。
答案 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来消除临时变量。唯一真正的缺点是生成的代码有些丑陋。