3

g++ を使用して、ループ不変コードのモーション最適化の結果を確認することにしました。しかし、次のコードをコンパイルして-fmove-loop-invariantsそのアセンブリを分析しk + 17たところ、ループ本体でまだ計算が実行されていることがわかりました。

コンパイラがそれを最適化するのを妨げるものは何ですか?

コンパイラは、再計算する方が効率的であると結論付けているのk + 17でしょうか?

int main()
{
    int k = 0;
    std::cin >> k;

    for (int i = 0; i < 10000; ++i)
    {
        int n = k + 17; // not moved out of the loop
        printf("%d\n", n);
    }

    return 0;
}

g++ 4.6.3 と g++ 4.8.3 の両方を使用して試しg++ -O0 -fmove-loop-invariantsてみました。g++ -O3g++ -O3 -fmove-loop-invariants

4

1 に答える 1