c - 为什么 Valac 在 C 代码中生成这些(毫无意义?)临时指针
问题描述
我开始研究 Vala,现在我不明白为什么在这些示例中,如果可以一次使用 tmp0,就会创建变量 tmp1? 和这里的 tmp1 tm3 一样
我阅读了一些文档,但不明白为什么 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 来消除临时变量。唯一真正的缺点是生成的代码有点难看。
推荐阅读
- android - 活动和线程通信
- proxy - 在 ansible playbook 中动态设置 HTTP_PROXY
- django - 在 WebApp 中显示的 django 中从 SQlite 添加数字
- windows - PowerShell 在 Windows Temp 中创建随机 ps1 脚本
- c# - 尝试将文本文件转换为 Excel
- google-cloud-platform - Publishing PermissionDenied desc = 用户无权执行此操作。谷歌云发布订阅
- python - TurboGear 框架 python 3.7 不起作用快速入门
- haskell - 通过 TemplateHaskell 的 sizeof、offsetof 和对齐
- javascript - npm run storybook 在新的反应项目上失败
- batch-file - 如果 zip 文件和文件夹名称相同,请将 zip 文件复制到文件夹中