我有以下代码:

#include "time.h"
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    unsigned int a = 2;
    unsigned long long sum = 0;

    clock_t begin = clock();
    for (size_t i = 1; i <= 2000000000; ++i)
    {
        //sum += i * a; --> this is faster than the below line
        sum += i << 1;
    }
    clock_t end = clock();

    cout << "time: " << ((double)end - begin) / CLOCKS_PER_SEC << endl;
    cout << "sum: " << sum << endl;
    return 0;
}

对于带乘法的代码,我得到:1.170秒。
对于带有左移运算符的代码,我得到:1.436秒。

我使用Visual Studio Express 2013,在 Release模式下进行编译。
我的机器运行的是Windows 7 Enterprise(64位)。

对我而言,有趣的是乘法快于移位,这是由于编译阶段进行了一些优化吗?

谢谢。

编辑:使用下面的建议,我反汇编了二进制文件,并且看来乘法时,编译器使用某种与MMX指令结合的循环展开。对于移位,移位直接在常规处理器寄存器中完成。

最佳答案

我没有完整的答案,因为我需要Visual Studio Express 2013进行验证,但是可以指出一些注意事项。

  • 在 Release模式下,乘以2的值可以由<
  • 类型“1”为“int”,“a”为“uint”。它可以产生不同的代码。
  • 向量化可能不稳定,并且在“*”情况下可以工作,但在“<

    关于c++ - 为什么左移运算符比乘法(C++)慢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23991313/

  • 10-13 07:52