計算に時間のかかる constexpr 関数

アバター
いわん
記事: 32
登録日時: 9年前

計算に時間のかかる constexpr 関数

投稿記事 by いわん » 1年前

constexpr キーワードを使うと定数式の評価をコンパイル時にやってくれるとの事。
ならばものすごく時間のかかる計算を constexpr 関数で作ってしまったらいつまでも
コンパイルが終わらないなんてことになるんだろうかと心配になってやってみました(^^;

関数は N 番目の素数を見つける処理です。constexpr の効果を見るだけなので計算効率とか
考えずに適当に作っています。
結果、N の値が大きくなると "C2131 式は定数に評価されませんでした" のコンパイルエラー
が発生しました。計算に時間がかかりすぎたせい?
N の値が小さすぎて定数値化の効果がよくわからなかったので繰り返しの中で使ってみたら
確かに実行時には式の評価は行っていないようです。

CODE:

// compiler Visual C++ 2019
//  最適化オプション無効
#include <iostream>

constexpr int prime(int n)
{
    if (n < 1)  return -1;
    if (n == 1) return 2;
    int x_n = 2;    // 素数番号
    int c = 3;      // 素数候補
    // n番目の素数が見つかるまで
    while (x_n < n)
    {
        c += 2;
        int d = 3;      // 素因数候補
        // 素因数候補が無くなるまで
        for (; d * d <= c; d += 2)
        {
            if (c % d == 0)
            {
                // 割り切れたら次の候補へ
                break;
            }
        }
        if (c % d != 0)
        {
            // 素数なので素数番号アップ
            ++x_n;
        }
    }
    return c;
}

int main()
{
    constexpr int n = 3129; // これより大きい数だとコンパイルエラー(C2131)となる
    constexpr int p = prime(n);
    std::cout << n << "番目の素数 " << p << std::endl;

    // 効果がよくわからないので繰り返しの中に入れた
    for (int i = 0; i < 10000; ++i)
    {
        constexpr int q = prime(n);
    }
}

アバター
もるも
記事: 54
登録日時: 9年前

Re: 計算に時間のかかる constexpr 関数

投稿記事 by もるも » 1年前

予約語で8文字以上だと見づらいのか拒否反応がでてしまう・・・(;^ω^)
だいぶ前からあったのにここで初めて知りました(*ノωノ)恥

アバター
いわん
記事: 32
登録日時: 9年前

Re: 計算に時間のかかる constexpr 関数

投稿記事 by いわん » 1年前

勉強さぼっているとどんどん知らないキーワードが溜まっていきます。
日記のネタ作りがてら勉強してますw