3

次のコードを検討してください。

// 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

4

2 に答える 2