代码之家  ›  专栏  ›  技术社区  ›  gavr

为什么Valac会产生这些(毫无意义?)C代码中的温度指针

  •  1
  • gavr  · 技术社区  · 7 年前

    我开始研究vala,现在我不明白为什么在这些例子中,如果可以同时使用tmp0,那么会创建变量tmp1? enter image description here 和这里的TMP1 TM3一样 enter image description here

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

    我真的很想了解vala编译器是如何工作的,现在我认为它很大程度上依赖于在gcc中使用-o3进行的优化,很明显它是默认的。我尝试用-o3标志编译,但没有,二进制文件的重量是相同的。

    1 回复  |  直到 7 年前
        1
  •  1
  •   nemequ    7 年前

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