Dado un metaprograma de plantilla (TMP), ¿los compiladores de C++ producen estadísticas de compilación que cuentan el número de clases instanciadas? ¿O hay alguna otra manera de obtener este número automáticamente? Entonces, por ejemplo, la obiquitous factorial¿Cuenta automáticamente el número de clases instanciadas en un TMP?
#include <iostream>
template<int N> struct fact { enum { value = N * fact<N-1>::value }; };
template<> struct fact<1> { enum { value = 1 }; };
int main()
{
const int x = fact<3>::value;
std::cout << x << "\n";
return 0;
}
me gustaría volver el número 3 (ya hecho < 3>, hecho < 2>, y el hecho de < 1> se crean instancias). Este ejemplo, por supuesto, es trivial, pero cada vez que empiece a usar, p. Boost.MPL, los tiempos de compilación realmente explotan, y me gustaría saber cuánto de eso se debe a instancias de clases ocultas. Mi pregunta es principalmente para Visual C++, pero las respuestas para gcc también serían apreciadas.
EDITAR: mi enfoque muy frágil actual de Visual C++ está agregando el interruptor de compilación de una de Stephan T. Lavavej videos/d1reportAllClassLayout y haciendo un grep + número de palabras en el archivo de salida, pero (a) aumenta compilar veces enormemente y (b) la expresión regular es difícil de obtener el 100% de lo correcto.
+1. Sugerí que debería ser bastante fácil piratear cualquier compilador de código abierto, pero en realidad lo probaste de la mejor manera posible (escribiendo un parche que realmente lo haga). – abarnert
¡Gracias! Lo que sería incluso más conveniente (¡sí, el aumento de alcance se acerca!) Es un registro de todas las plantillas de clase y el número de instancias, en lugar de solo el número total o la lista completa de todas las instancias. Tal vez un script de Perl para postprocesar el registro de compilación completo es lo que debería intentar. – TemplateRex
simplemente canalice la salida a 'awk -F '<' '{templates [$ 1] ++} END {para (t en plantillas) print t, templates [t]}' –