【发布时间】:2019-03-22 06:11:11
【问题描述】:
假设一个数字具有非常大的值,例如 9,046,744,073,709,551,615。
我使用加法、乘法和左移将值加倍。
#include <iostream>
using namespace std;
int main(){
unsigned long long int value = 9046744073709551615;
cout << (value + value) << endl;
cout << (value * 2) << endl;
cout << (value << 1) << endl;
return 0;
}
哪个计算得更快?
【问题讨论】:
-
为什么不检查编译器的汇编输出并启用优化?您可能会发现每一个都转换为相同的代码。
-
编译器在微优化方面比人类要好得多。使用在代码上下文中有意义的那个。 (在这种特殊情况下,任何体面的编译器都会在编译时执行每个操作并打印一个常量。)
-
为什么你认为数字的大小很重要?
-
value is hardcoded 或read at runtime 时,每种情况下的优化程序集相同。
-
Steve Maguire,“Writing Solid Code”,1993 年:“多年来,我发现了程序员使用移位来划分不能保证为正的有符号值的错误。我已经追踪了程序员转向错误方向的错误。我什至追踪了程序员通过不小心将表达式如 a=b+c/4 转换为 a=b+c>>2 而引入优先级错误的错误。我不知道不记得曾经追踪过一个错误,其中程序员打算除以 4 并在输入字符 / 和 4" 时出错
标签: c++