次のコードを検討してください。
// 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;
}
これは、同じ結果を生成する 2 つの関数の動作を示しています。
f1
: 条件はループ内でテストされますf2
: 条件はループ外でテストされます
x
分岐は、 として宣言されている に基づいていconst
ます。
私の質問は次のとおりです。すべての最適化レベルがオンになっている場合、コンパイラは変換f1
するのに十分なほどインテリジェントですか?f2