【发布时间】:2013-08-15 16:11:18
【问题描述】:
考虑以下代码:
// Preprocessor
#include <iostream>
#include <vector>
// Internal branching
void f1(std::vector<int>& v, const int x = 0)
{
for (unsigned int i = 1; i < v.size(); ++i) {
v[i] = (x != 0) ? (v[i-1]*x) : (v[i-1]+v[i-1]);
}
}
// External branching
void f2(std::vector<int>& v, const int x = 0)
{
if (x != 0) {
for (unsigned int i = 1; i < v.size(); ++i) {
v[i] = v[i-1]*x;
}
} else {
for (unsigned int i = 1; i < v.size(); ++i) {
v[i] = v[i-1]+v[i-1];
}
}
}
// Main
int main()
{
std::vector<int> v(10, 2);
f1(v);
f2(v);
return 0;
}
它说明了产生相同结果的两个函数的行为:
-
f1:条件在循环内部进行测试 -
f2:条件在循环外测试
分支基于x,声明为const。
我的问题是:当所有优化级别都打开时,编译器是否足够智能以将f1 转换为f2?
【问题讨论】:
-
对于这段代码,我希望编译器完全消除检查,只为
x == 0构建代码。您当然可以提出编译器无法做到这一点的场景,但在这种情况下,当然可以。 [当然,如果你真的关心你的特殊情况,那么用你的编译器和你的真实代码对它进行基准测试!]
标签: c++ optimization c++11 for-loop conditional