问题说明了一切。有谁知道以下...
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
注意 shrq $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/