为什么 Valac 在 C 代码中生成这些(无意义的?)临时指针
Why Valac generates these (meaningless?) temp pointers in C code
我开始研究Vala,现在我不明白为什么在这些示例中创建变量tmp1 如果可以立即使用tmp0?
与此处的 tmp1 tm3 相同
我稍微阅读了文档,但不明白为什么 valac 会生成这些临时指针。
https://wiki.gnome.org/Projects/Vala/Hacking#Documentation
我真的很想了解 Vala 编译器如何 works.Now 我认为它在很大程度上依赖于 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消除临时变量。唯一真正的缺点是生成的代码有点难看。
我开始研究Vala,现在我不明白为什么在这些示例中创建变量tmp1 如果可以立即使用tmp0?
我稍微阅读了文档,但不明白为什么 valac 会生成这些临时指针。 https://wiki.gnome.org/Projects/Vala/Hacking#Documentation
我真的很想了解 Vala 编译器如何 works.Now 我认为它在很大程度上依赖于 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消除临时变量。唯一真正的缺点是生成的代码有点难看。