Esto realmente no es una respuesta a su pregunta. Es más una observación lateral.
No soy abogado de C++, por lo que podría estar fuera de lugar con algunos de los detalles.
Pero, la idea aproximada debería ser correcta.
La razón principal por la que los compiladores de C++ tardan tanto tiempo en compilar los metaprogramas de plantillas es por la forma en que se especifican los metaprogramas de las plantillas.
No se especifican directamente como código que desea que el compilador ejecute en tiempo de compilación. Tome el ejemplo de calcular la longitud de una lista de tipos.
Si usted podría escribir código como este:
compile_time size_t GetLength(TypeList * pTypeList)
{
return DoGetLength(pTypeList, 0);
}
compile_time size_t DoGetLength(TypeList * pTypeList, size_t currentLength)
{
if (pTypeList)
{
return DoGetLength(pTypeList->Next, ++currentLength);
}
else
{
return currentLength;
}
}
Eso era de alguna forma compilada por separado del código donde fue utilizado, y fue expuesto a la lengua a través de una sintaxis, entonces el compilador sería capaz de ejecutarlo muy rápido.
Sería una simple llamada a función recursiva.
Es posible diseñar un lenguaje que permita ese tipo de cosas. La mayoría de los que hacen esto (como Lisp) se tipean dinámicamente, pero es posible hacerlo con tipeo estático. Sin embargo, es probable que nunca sea algo que verías implementado en C++.
El problema en C++, sin embargo, es que el código se escribe así:
template <typename First, typename Second>
struct TypeList
{
typedef First Head;
typedef Second Tail;
};
template <>
struct ListSize<NullType>
{
enum { size = 0 };
};
template <typename Head, typename Tail>
struct ListSize<TypeList<Head, Tail> >
{
enum { size = 1 + ListSize<Tail>::size };
};
Para que el compilador para "ejecutar" el meta-programa que tiene que:
- Construct un gráfico de dependencia para los valores iniciales del valor de enumeración "tamaño"
- Construir un tipo de plantilla para cada borde en el gráfico
- Enlazar todos los símbolos referenciados por cada construcción tipo de plantilla
- ordenar Topologically la gráfica de dependencia
- Traverse el gráfico y evaluar las constantes
Esto es mucho más caro que simplemente la ejecución de un O (N) algoritmo recursivo.
El peor caso sería algo así como O (N * M * L), con N igual a la longitud de la lista, M es el nivel de anidación del alcance y L es el número de símbolos en cada ámbito.
Mi consejo sería minimizar la cantidad de meta-programación de plantilla C++ que utiliza.
Prefiero que los desarrolladores de compiladores se concentren en la optimización del código generado y aprovechen el paralelismo (SMP, distcc, Xoreax IncrediBuild, etc.) para acelerar las compilaciones. – bk1e
¿Por qué no hacer que trabajen en ambos problemas? La ganancia que espero de un compilador de C++ que ha sido optimizado para plantillas es mucho más alta que la que obtengo al usar el paralelismo (y ya lo hago), a menos que esté rodeado por un trillón de computadoras esperando que compile el código (no lo hago). t)! –