2011-06-22 13 views
5

¡¿Qué clase de magia malvada está tratando de hacer ?!¿Por qué los conceptos hacen que la compilación de C++ sea más lenta?

Estaba escuchando un Q&A session with herb sutter y una pregunta era sobre conceptos. Herb mencionó que hizo los compiladores más lentos (mientras que la fuente permanece sin cambios) y la sección fue significativamente más grande que la sección de plantillas.

¿Por qué hace esto? ¿Dónde puedo encontrar documentación sobre conceptos?

Respuesta

9

En primer lugar, Herb no dijo que los conceptos mismos hicieran la compilación más lenta. Dijo que el concepto de la biblioteca estándar de C++ hacía que cualquier código que utilizara la compilación de la biblioteca estándar de C++ fuera más lento.

El motivo se debe a varias cosas.

1: Restringir plantillas lleva tiempo de compilación.

Cuando se declara una clase como esta:

template<typename T> class Foo {...}; 

El compilador simplemente analiza Foo y hace muy poco. Incluso con la búsqueda en dos fases, el compilador simplemente no hace mucho en la compilación de la clase Foo. Lo almacena para más adelante, por supuesto, pero el pase inicial es relativamente rápido.

Al hacer limitar la plantilla con un concepto:

template<ConceptName C> class Foo {...}; 

El compilador debe hacer algunas cosas. Debe verificar por adelantado que cada uso del tipo C se ajusta al concepto ConceptName. Es un trabajo adicional que el compilador habría postergado hasta el momento de la instanciación.

Cuanta más verificación de concepto tenga, más tiempo de compilación gastará para verificar que los tipos coincidan con los conceptos.

2: La biblioteca estándar de C++ utiliza muchos conceptos.

Mire la cantidad de conceptos de iterador: entrada, salida, avance, bidireccional, secuencial, contiguo. Y el comité estaba considerando dividirlos en muchos más que eso. Muchos algoritmos tendrían múltiples versiones para diferentes conceptos de iterador.

Y esto no incluye los conceptos de rango (de los cuales hay uno para cada tipo de concepto de iterador excepto la salida), conceptos de caracteres para std :: string y varios otros tipos de cosas. Todos estos deben compilarse y verificarse.


¿Qué conceptos realmente necesarios para que sea rápido es módulos. La capacidad del compilador de generar un archivo de módulo que contenga una secuencia de símbolos previamente comprobados, y luego cargar ese archivo directamente sin tener que pasar por el proceso de compilación estándar. Directamente desde el análisis hasta la creación del símbolo.

Recuerde: para cada archivo .cpp que #include, el compilador debe leer ese archivo y compilarlo. Aunque el archivo es el mismo cada vez que lo hace, todavía debe leer diligentemente el archivo y procesarlo. Si estamos hablando de un concept -ized std::vector, tiene que hacer toda la verificación del concepto de la plantilla. Todavía tiene que hacer toda la búsqueda de símbolos estándar que haces al compilar. Etcétera.

Imagine si el compilador no tiene que hacer esto. Imagínese si pudiera simplemente cargar un montón de símbolos y definiciones directamente desde el disco. Sin compilación en absoluto; solo trayendo símbolos y definiciones para otro código para usar.

Sería como encabezados precompilados solo mejores. Los encabezados precompilados están limitados a tener solo uno por archivo .cpp, mientras que puede usar tantos módulos como desee.

Lamentablemente, los módulos se arrancaron bastante temprano en el proceso de C++ 0x. Y sin módulos, restringir la biblioteca estándar con conceptos siempre compilará más lentamente que la versión no restringida.

Tenga en cuenta que Herb no entiende el propósito de los módulos (no es difícil, ya que la mayoría de los conceptos iniciales de la función eran de los que hablaba: DLL multiplataforma y demás). Su objetivo fundamental es ayudar a compilar los tiempos, no hacer que las DLL multiplataforma funcionen. Tampoco se pretende que los módulos sean multiplataforma.

+0

+! para la explicación de la lentitud causada por los conceptos, pero ¿tiene una referencia para la visión de los conceptos que presenta (en oposición a la que tiene Herb Sutter)? –

+0

@Ben Voigt: Eso eran módulos, no conceptos. Y no es mi visión; son los objetivos de diseño del documento de los módulos más reciente delineado por Daveed Vandevoorde en N2316. Está disponible en formato PDF aquí: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2007/ –

+0

Sí, quise decir módulos. Una referencia de grupo de trabajo es exactamente lo que esperaba. –

0

Puede encontrar recursos útiles en el ConceptsGCC website. Ese es el compilador (bifurcado de GCC) que estaban construyendo para ver si el concepto (perdón por el juego de palabras) era factible.

Imagino que el gasto proviene de tener que realizar comprobaciones de validez completas y ubicuas y recursivas en todo tipo de construcciones de lenguaje, y dado que puede especificar un conjunto bastante rico de restricciones, verificarlas puede ser muy costoso.

¡Un poco como una versión de pesadilla de las especificaciones de excepción!

Cuestiones relacionadas