Ich habe vor kurzem in die Vorlage Metaprogrammierung mit C++ bekommen und habe versucht, einige grundlegende Funktionen in ihre jeweilige rekursive Kompilierungszeit Vorlage Definition zu konvertieren.Wie behandelt C++ rekursive Klassendefinitionen?
Zum Beispiel:
template <typename T, T A, unsigned int N>
class pow { enum : T { value = A * pow<T, A, N-1>::value } };
template <typename T, T A> class pow<T, A, 0> { enum : T { value = 1 } };
Die Syntax und die Macht der Vorlagen erstaunt mich. Aber eine Frage nervt mich: Wie behandelt C++ diese rekursiven Definitionen? (Resource-wise)
Oder genauer gesagt:
Wie funktioniert der Compiler die Instanz Erstellung der Template-Klassen behandeln die ENUM-Werte, die (wo/wie der Speicher zugeordnet)?
Bleiben alle generierten Klassen nach der Kompilierung im Speicher oder werden sie vom Compiler optimiert, wobei nur die oberste Klasse (Cleanup) beibehalten wird?
Gibt es eine maximale rekursive Tiefe, die RAM-unabhängig ist (Einschränkungen durch den Compiler selbst)?
Eine ausführliche Erklärung bezüglich der Standardkompilierung solcher Strukturen wäre sehr willkommen.
_ "Gibt es eine maximale rekursive Tiefe, die ..." _: g ++ hat '-ftemplate-depth = n' finden Sie unter: https: //gcc.gnu .org/onlinedocs/gcc/C_002b_002b-Dialekt-Optionen.html # C_002b_002b-Dialekt-Optionen –
Es ist dann 1024. Aber ist es eine Compiler-Constraint oder nur eine Konvention (seit 17 ist eine seltsame Wahl für frühere C++ - Standards)? –
Ich kann mir nicht vorstellen, dass ein Compiler die instanziierten Typen ablegt, schließlich hat es keine Möglichkeit zu wissen, ob es irgendwann in der Zukunft wieder verwendet wird. Nur während der Link-Phase wird eine Art Culling durchgeführt. Und mit der Metaprogrammierung würde ich erwarten, dass die Keulung vollständig ist. – SoronelHaetir