为何[[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
相关产品推荐
相关产品推荐

