ac/c 编译器是否通过二次幂值将常量除法优化为移位?

新手上路,请多包涵

问题说明了一切。有没有人知道以下…

 size_t div(size_t value) {
    const size_t x = 64;
    return value / x;
}

…优化成?

 size_t div(size_t value) {
    return value >> 6;
}

编译器会这样做吗? (我的兴趣在于 GCC)。在某些情况下可以做到,而在其他情况下不可以?

我真的很想知道,因为每次我写一个可以像这样优化的分区时,我都会花一些精力去思考是否浪费了一秒钟宝贵的时间来做一个轮班就足够了的分区。

原文由 porgarmingduod 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 327
1 个回答

即使使用 g++ -O0 (是的, -O0 !),这种情况也会发生。您的函数编译为:

 _Z3divm:
.LFB952:
        pushq   %rbp
.LCFI0:
        movq    %rsp, %rbp
.LCFI1:
        movq    %rdi, -24(%rbp)
        movq    $64, -8(%rbp)
        movq    -24(%rbp), %rax
        shrq    $6, %rax
        leave
        ret

注意 shrq $6 ,它是右移 6 位。

使用 -O1 ,删除不必要的垃圾:

 _Z3divm:
.LFB1023:
        movq    %rdi, %rax
        shrq    $6, %rax
        ret

在 g++ 4.3.3、x64 上的结果。

原文由 Thomas 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题