Adv*_*ous -1 c c++ optimization integer-arithmetic
问题示例:
计算123 * 456是否比计算123456 * 7890快?还是相同的速度?
我想知道32位无符号整数,但是我不会忽略其他类型(64位,有符号,浮点型等)的答案。如果不同,则有什么不同?这些位是否为0/1?
编辑:如果有所不同,我应该澄清一下,我指的是任何数字(两个低于100的随机数与两个高于1000的随机数)
对于至少达到架构字长的内置类型(例如,现代PC上的64位,最近几十年来大多数低成本通用CPU上的32位或16位),对于每个编译器/实现/版本和CPU,曾经听说过,用于特定整数大小乘法的CPU操作码需要一定数量的时钟周期,而与所涉及的数量无关。不同大小的数据乘法在某些CPU上的执行方式不同(例如,AMD K7对于16位IMUL具有3个周期的延迟,而对于32位则具有4个周期的延迟)。
在某些体系结构和编译器/标志组合中,像这样的类型可能long long int具有比CPU操作码在一条指令中可操作的位数更多的位,因此,编译器可能会发出代码以分阶段进行乘法,并且比进行乘法运算要慢。 CPU支持的类型。但是同样,在运行时以较大类型存储的较小值不太可能被处理或执行,与较大值不同。
综上所述,如果一个或两个值都是编译时常量,则编译器能够避免CPU乘法运算符,并针对某些值(例如1,显然是无操作,任一侧0 ==)优化为加法运算符或移位运算符。> 0结果,* 4有时可以实现为<< 2。没有特别的停止技术,例如将移位用于较大的数字,但是可以将较小百分比的此类数字优化到相同的程度(例如,有更多的2的幂,可以使用向左移位进行乘法-介于0和1000之间,而不是1000和2000之间)。