【发布时间】:2018-12-01 02:18:18
【问题描述】:
根据comment here 中的建议,我试图了解Compiler Explorer 的工作原理。我的输入是以下代码:
int main() {
double x,y,x0,y0,x1,y1;
x = 10;
y = 10;
x0 = 5;
y0 = 5;
x1 = 15;
y1 = 15;
if (x > x0 && x < x1 && y > y0 && y < y1)
return 1;
return 0;
}
结果是:
mov eax, 1
ret
多年前我已经学习了汇编程序的基础知识,但我不知道这是否有意义,或者如何有意义。可以? (我试图找到的是在两个返回之间添加“else”是否会对性能产生任何影响。根据这个网站,它没有。但我做对了吗?)
【问题讨论】:
-
这很有意义。无论您运行此代码多少次,最终结果始终为 1。编译器足够聪明,可以计算出来。所以这就是你得到的。到底有什么不清楚的地方?
-
您的变量在每次运行时始终具有相同的值。编译器看到了这一点,并正在为您评估整个
main函数,它似乎总是返回 1。尝试禁用优化或让用户在运行时给出变量值。 -
如果你不喜欢高效的代码,也许你应该学会使用
volatile! -
是的,这个问题不值得保留。常量传播是最重要的编译器优化之一,但也相当简单明了。请参阅How to remove "noise" from GCC/clang assembly output? 的问答,该问答建议使用 args 而不是常量编写函数,就像您在更新中所做的那样。
标签: c++ if-statement assembly x86