You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何[[assume]]未优化multiply_by_pow_of_2?如何让编译器识别2的幂参数?

问题:如何让编译器利用[[assume]]优化2的幂乘法?

我期望multiply_by_pow_of_2函数能生成更高效的乘法代码——因为我用了[[assume(std::has_single_bit(multiplier))]]来告知编译器第二个参数multiplier始终是2的幂,理论上应该能替换成更快的左移操作。但实际编译器生成的代码仍使用imul指令,和未添加假设时完全一致:

multiply_by_pow_of_2(unsigned int, unsigned int):
        mov     eax, esi
        imul    eax, edi
        ret

另外,在main中调用该函数时,对比直接写argc * 8的生成代码,发现两者都被转换为lea指令(而非预期的左移操作):

lea     esi, [0+rdi*8]

示例代码如下:

#include <bit>
#include <cstdio>

unsigned multiply_by_pow_of_2( unsigned num, unsigned multiplier ) noexcept
{
    [[ assume( std::has_single_bit( multiplier ) ) ]];
    return num * multiplier;
}

int main( int argc, char* argv[ ] )
{
    unsigned result;

    if constexpr ( true )
    {
        result = multiply_by_pow_of_2( argc, 8 );
    }
    else
    {
        result = argc * 8;
    }

    std::printf( "%d\n", result );
}

使用-O3编译后生成的完整代码:

multiply_by_pow_of_2(unsigned int, unsigned int):
        mov     eax, esi
        imul    eax, edi
        ret
.LC0:
        .string "%d\n"
main:
        sub     rsp, 8
        lea     esi, [0+rdi*8] ; <- 此处
        xor     eax, eax
        mov     edi, OFFSET FLAT:.LC0
        call    printf
        xor     eax, eax
        add     rsp, 8
        ret

无论是否添加假设语句,该函数的生成代码都没有任何变化。是不是我没能成功让编译器信服multiplier是2的幂?该如何实现预期的优化?

内容的提问来源于stack exchange,提问作者digito_evo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:50:06