【问题标题】:Why did a large comparison become 1 line of assembler code?为什么一个大的比较变成了 1 行汇编代码?
【发布时间】: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


【解决方案1】:

条件为真。编译器对其进行优化;它为return 1; 生成代码。

【讨论】:

  • 对,我做错了。现在我想我最好删除这个问题,虽然我会先编辑它,看看你说什么。
  • 我正在考虑删除这个问题。但我不能因为你的回答。你说什么?
猜你喜欢
  • 1970-01-01
  • 2015-06-22
  • 2013-08-13
  • 2012-06-29
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
相关资源
最近更新 更多