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

标签 c++ c optimization gcc

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

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

...优化成?

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

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

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

最佳答案

即使使用 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

注意 shr​​q $6,它是右移 6 位。

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

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

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

关于c++ - c/c++ 编译器是否通过二次幂值将常量除法优化为移位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2580680/

相关文章:

c++ - kafka消费者在zookeeper中的注册列表

c++ - 什么样的DataStructures可以实现并行处理

C 中的类型可以有多个对象表示吗?

c - 如何分成两组?

mysql - 使用 WHERE 子句优化 DELETE FROM

c++ - C++14 中语句 (void)f() 的状态,它的格式是否错误?如果不是,f() 部分是丢弃值吗?

C++ 模板和带有方法指针的继承

c++ - 双参数构造函数的用户定义文字

python - 查找二维数组中最高元素的列表 : Python 3

c++ - 变量类型困惑