math - 编译器是否优化数学表达式?

标签 math optimization rust expression compiler-optimization

rustc 会优化这些表达式吗?

  • 2*x -> x<<1
  • x/2 -> x>>1
  • x % 8 -> x&7
  • 等等
  • 最佳答案

    此类微不足道的优化在 LLVM optimization passes 的领域内,实际上生成的程序集甚至更好,更正确。2*x编译为单条指令 lea rax, [rdi + rdi] ,在所有现代 x86 处理器上都是单 uop(相关 question)x/2对于带符号的数字被编译为最快和正确的方式,在 -1 的情况下给出正确的答案(相关question

    mov     rax, rdi
    shr     rax, 63
    add     rax, rdi 
    sar     rax 
    
    但编译为无符号数的右移
    mov     rax, rdi
    shr     rax
    
    同样的故事也适用于 x % 8它编译为带符号数的长程序集(对于负数)
    mov     rax, rdi
    lea     rcx, [rdi + 7]
    test    rdi, rdi
    cmovns  rcx, rdi
    and     rcx, -8
    sub     rax, rcx
    ret
    
    并到 and无符号数指令(相关 question)
     mov     rax, rdi
     and     eax, 7
     ret
    
    Godbolt link

    关于math - 编译器是否优化数学表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67135579/

    相关文章:

    c++ - C++ 和 OpenGL 矩阵顺序之间的混淆(行优先 vs 列优先)

    algorithm - 如何在 sqrt{n} 时间内执行范围更新?

    python - Python 中的操作顺序和快速计算

    pattern-matching - 如何在 Rust 中指定 Some 参数的类型?

    types - 如何将生成器存储在结构中?

    error-handling - .parse().expect ("err") panic 而不是处理解析错误

    python - 如何在 Python 中将 -1/(-343)^(1/3) 计算为 1/7?

    algorithm - 将非均匀伪随机生成转换为均匀?

    java - 贪心算法给出可疑结果

    python - 随机 Python 模拟的校准