0

コンパイル時の計算は、パフォーマンスを向上させるためにプログラム実行中に計算される部分の代わりにコンパイラによって計算できるものです。反復計算は、プログラムの実行時には可能ですが、コンパイル時には実行できません。ひとつの面倒で具体的な例はVariadic Templatesですが、標準とコンパイラが提供するさまざまな型を処理する反復について自然に考えていますが、プログラマはそれらを再帰的に処理する必要があります。コンパイル時の計算の繰り返し可能性

一般に、すべてのコンパイル時の計算は反復ではなく再帰によって処理されます。私が知る限り、コンパイル時に計算されると予想されるconstexpr関数は再帰的であると考えられます。何がコンパイル時に禁止されているのですか?

+0

再帰は繰り返しの一種です。 – rici

+0

'std :: integer_sequence'を使うこともできます –

+0

' constexpr'関数のためにC++ 14では正規反復が許されています。問題は、関数が 'constexpr'であることをチェックすることです。再帰と反復は簡単です。 – Jarod42

答えて

1

Hammerで最適化として定数部分式を削除すると、コード生成中に再帰が発生するという問題が発生しました。変数を単に定義する必要はありません。単純に定数に置き換えられるからです。

一方、ループを実行しようとしている場合、実行時に定数の操作を実行するだけでなく、言語の完全なインタープリタであるコードを持つ必要があります。変数を宣言し、値を設定して(ループカウンタとして)受け取ることができ、さらに悪いことに、無限ループを検出してコンパイラがハングしないようにする必要があります(つまり、while(true);は完全に定数式です)。

簡単に言えば、パーサー、AST、およびオプティマイザの性質上、完全な制御フローを実装してループや変数操作を実装するよりも、コンパイル時に部品を再帰的に評価する方が簡単です。