int y = 17*x;
int y = x + 16*x;
int y = x + (x<<4)
所有数字在数值上等于17x,但在执行或其他方面它们之间是否有任何区别?
答案 0 :(得分:2)
严格来说,这取决于x
的类型和价值。就标准而言,溢出已签名的int
是未定义的行为,因此例如,允许的实现根据您的代码是否包含2个溢出的操作或仅1来执行不同的行为
假设所有内容都是保持在边界内的整数,则这些语句具有相同的含义。它们似乎都会产生完全相同的发出代码,但您必须通过编译器和编译器选项来检查它。这更有可能是您拥有的更多优化。
你也会看到为第一个代码发出一个代码版本(编译器发出一个乘法),另外两个代码发出不同的代码(编译器发出一个add并乘以16或者a)转移4)。即使没有优化,编译器也会在编译时评估1<<4
- 标准要求编译器能够在某些上下文中评估这样的表达式,因此编译器没有理由不这样做。
答案 1 :(得分:2)
1) int y = 17*x;
2) int y = x + 16*x;
3) int y = x + (x<<4);
区别在于:1)是可读的,2)是模糊的,3)更加模糊。
在现代编译器上不应该需要手动优化,用位指令替换乘法。它很可能将所有3个替代品翻译成相同的机器代码。
如果编译器坏了并且不将它们转换为相同的机器代码,那么我们无法知道哪个是最快的,因为它依赖于底层汇编程序指令的速度有多快对于特定的CPU架构。传统上,逻辑移位指令比乘法指令更快,但您不能假设所有CPU都适用。