在旧版本中测试代码gcc-4.4.0
,gcc-4.6.4
编译器能够应用智能优化并预先计算输入的结果const
:
#include <iostream>
#include <chrono>
using namespace std;
const auto N = 1000000000ULL; // constexptr is tested, no effect
unsigned long long s(unsigned long long n)
{
auto s = 0ULL;
for (auto i = 0ULL; i < n; i++)
s += i;
return s;
}
int main()
{
auto t1 = std::chrono::high_resolution_clock::now();
auto x = s(N);
auto t2 = std::chrono::high_resolution_clock::now();
auto t = std::chrono::duration_cast<std::chrono::nanoseconds>(t2-t1).count();
cout << "Result: " << x << " -- time (ms):" << t/0.1e7 << endl;
}
N
是一个常数值,然后编译器可以s
在编译时运行函数并将结果分配给x
. (不需要运行时计算N
)
产生不同版本的 gcc(以及一个版本的 clang):
- 最新版本(clang-3.4)结果(预先计算)
0.001532 ms
:. - 旧版本(gcc-4.4.0)结果(预先计算)
0.013517 ms
:. - 旧版本(gcc-4.6.4)结果(预先计算)
0.001 ms
:. - 较新的版本(gcc-4.8.0+)不会在编译时计算它,结果:
1313.78 ms
!!。
问题:
- 4.8.1 中是否省略了此优化?为什么?
- 是否有任何编译器命令/开关来启用它(如果它默认禁用)?
如果省略,如何强制编译器进行此预计算?
注意(1):我测试了两个-O2
和-O3
开关,没有效果。
注意(2):强制,我的意思是编译器的命令和开关。
注(3):函数s
只是一个例子,可以用更复杂的函数代替。