ならばものすごく時間のかかる計算を constexpr 関数で作ってしまったらいつまでも
コンパイルが終わらないなんてことになるんだろうかと心配になってやってみました(^^;
関数は N 番目の素数を見つける処理です。constexpr の効果を見るだけなので計算効率とか
考えずに適当に作っています。
結果、N の値が大きくなると "C2131 式は定数に評価されませんでした" のコンパイルエラー
が発生しました。計算に時間がかかりすぎたせい?
N の値が小さすぎて定数値化の効果がよくわからなかったので繰り返しの中で使ってみたら
確かに実行時には式の評価は行っていないようです。
// 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);
}
}