int y = 17*x;
int y = x + 16*x;
int y = x + (x<<4)
所有数字都等于 17x ,但它们在执行或其他方面有什么区别吗?
int y = 17*x;
int y = x + 16*x;
int y = x + (x<<4)
所有数字都等于 17x ,但它们在执行或其他方面有什么区别吗?
严格来说,它取决于 的类型和值x
。就标准而言,溢出符号int
是未定义的行为,因此例如,根据您的代码是否包含 2 个溢出操作或仅 1 个,允许实现的行为不同。
假设一切都是保持在界限内的整数,那么这些语句具有相同的含义。有可能它们都会产生完全相同的代码,但您必须通过编译器和编译器选项进行检查。这更有可能是您拥有的优化越多。
您可能会看到为第一个发出的代码的一个版本(编译器发出乘法)和为其他两个发出的不同代码(编译器发出加法和乘以 16 或移位 4 也是合理的) )。即使没有优化,编译器也会1<<4
在编译时进行评估——标准要求编译器能够在某些上下文中评估此类表达式,因此编译器没有理由不这样做。
1) int y = 17*x;
2) int y = x + 16*x;
3) int y = x + (x<<4);
区别在于:1) 可读,2) 晦涩难懂,3) 更加晦涩难懂。
现代编译器不需要手动优化,用按位指令代替乘法。它很可能会将所有 3 种替代方案翻译成相同的机器代码。
如果编译器不好并且没有将它们转换为相同的机器代码,那么我们就无法知道哪个是最快的,因为它依赖于特定 CPU 架构的底层汇编指令的速度。传统上,逻辑移位指令比乘法指令快,但您不能假设所有 CPU 都是如此。