C/C++ 编译器是否将按二次方值进行常量除法优化为移位?

2024-02-20

问题说明了一切。有谁知道以下是否...

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

...优化为?

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

编译器会这样做吗? (我的兴趣在于海湾合作委员会)。是否有一些情况会出现这种情况,而另一些情况则不会?

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


即使g++ -O0 (yes, -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 位。

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

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

g++ 4.3.3、x64 上的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++ 编译器是否将按二次方值进行常量除法优化为移位? 的相关文章

随机推荐