0

テンプレートが C++ でどのように遅延評価されるかを理解していると思います。たとえば、再帰的な置換と展開の最終的な単純化です。これは通常、利用可能な再帰の深さを制限します。C++11 の新機能 (可変個引数テンプレートやテンプレート パックなど) や一部の Boost を使用して、テンプレートの厳密な評価を強制できるのではないかと思います。それとも、これは原則として C++ では不可能ですか?

たとえば、すべての整数値を合計するテンプレートを考えてみましょう0..n:

template <int n>
struct sumAll { enum { value = n + sumAll<n-1>::value }; };

template <>
struct sumAll<0> { enum { value = 0 }; };

#include <iostream>
int main() { std::cout << sumAll<10000>::value << std::endl; }

ここsumAll<10>::valueに展開されます

sumAll<10>::value = 10 + sumAll<9>::value
                  = 10 + 9 + sumAll<8>::value
                  = 10 + 9 + 8 + sumAll<7>::value
                  = ...
                  = 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0

最終的な合計は、テンプレートが完全に展開された後にのみ実行されます。最終的な展開が長くなりすぎると (たとえば、多くの項を含む複雑な級数展開の場合)、コンパイラは最終的に追加の項を格納するためのスペースを使い果たします。

私の質問は本質的に、単純化(上記の合計など)を以前に実行する方法があったかどうかでした。

4

2 に答える 2

1

C++ テンプレートはチューリング完全です。つまり、それらを使用して、コンパイル時にすべての計算可能な関数を評価します。すると、停止定理から、

  1. 一般に、C++ プログラムのコンパイルに必要なメモリ量を事前に計算することはできません。(つまり、すべての C++ プログラムをそのコンパイル用にバインドされたメモリにマップする計算可能な関数はありません)
  2. 一般に、コンパイラがテンプレートのインスタンス化を終了するか、永久に続行するかを決定することはできません。

そのため、場合によってはコンパイラを微調整して使用するメモリを減らすことができるかもしれませんが、メモリが不足するという一般的な問題を解決することはできません。

于 2012-10-12T11:25:15.270 に答える