【发布时间】:2015-09-12 22:07:17
【问题描述】:
我在 *nix 上。在looptest.cpp中有这个简单的c++代码
#include <iostream>
#include <time.h>
int main()
{
double sum = 0.0;
int n ;
std::cout << "n ?" << std::endl;
std::cin >> n ;
clock_t t_start = clock();
for (int i = 0 ; i < n ; ++i)
{
sum+= static_cast<double>(i);
}
clock_t t_end = clock();
clock_t diff = t_end - t_start;
double diffd = static_cast<double>(diff)/CLOCKS_PER_SEC;
std::cout << diffd << " seconds." << std::endl;
sum*=1.0;
return 0;
}
使用 intel c++ 编译器 (icpc (ICC) 14.0.4 20140805, 2013) 编译如下:
/opt/intel/bin/icpc looptest.cpp -o looptest
当我测试它时,我有以下奇怪的结果:
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
10000
4e-06 seconds.
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
100000
3e-06 seconds.
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
1000000
3e-06 seconds.
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
1000000000
2e-06 seconds.
My-MacBook-Air:tmp11 XXXX$ ./looptest
n ?
4294967295
3e-06 seconds.
很奇怪,不是吗?这里发生了什么 ?当然,使用 gnu-5.2 的 g++ 而不是 icpc 编译会得到预期的结果(当 n 增加时,时间会增加。)
【问题讨论】:
-
C++ 编程中从来没有任何神奇。跳过这个概念,变得认真!
-
他把“神奇的”放在引号中表示它不是真正的神奇。
-
用 -ffast-math 也试试 g++
-
优化器能够确定你没有对计算结果做任何事情,因此它可能只是删除了你的循环。
-
@πάνταῥεῖ,不过,未定义的行为可能会导致一些非常神奇的优化后行为。