2011-06-01 8 views
8

Al mirar este proyecto (http://www.savarese.com/software/libssrckdtree/) encontré la definición "biblioteca de plantillas de encabezado C++". Por el momento tengo conocimiento básico de C++ pero me gustaría saber qué significa exactamente y por qué esta gente lo usa en este proyectobiblioteca de plantillas solo de encabezado C++

Respuesta

11

Significa que todas las definiciones de plantilla (plantilla de función o plantilla de clase) están solo en los encabezados. No hay ningún archivo .cpp. Sólo hay .h archivos (o algunas otras extensiones como .hpp o sin extensión en absoluto como <vector>, string> etc) compiladores

C++ requieren las definiciones de plantillas para estar presentes en el mismo archivo en el que están declaradas. Como tal, la biblioteca de solo encabezado no es ni biblioteca estática ni biblioteca dinámica. Es fuente-código biblioteca lo que significa que puede ver la implementación en los encabezados. Incluyó los archivos de encabezado en su código, que se compila junto con los encabezados de la biblioteca.

Tenga en cuenta la parte de la biblioteca estándar de C++ que hace uso de plantillas como <vector>, string>, <map>, etc. es biblioteca de solo cabecera.

En realidad, las plantillas (plantillas de clases y plantillas de funciones) no se pueden compilar en bibliotecas estáticas o dinámicas para vincularlas a programas.Una plantilla es, como dice el término en sí, una plantilla; no es un código normal; es solo cuando se lo utiliza en su código se pasa el argumento de plantilla (s) (que es ya sea type o value), el compilador genera una función/clase compilables de la plantilla de función/clase:

template<typename T> 
struct A 
{ 
    T data; 
}; 

struct B 
{ 
    int data; 
}; 

Aquí, A no se puede compilar en binario (biblioteca estática o biblioteca dinámica), porque el compilador no sabe qué es T. Pero B se puede compilar en binario, ya que el compilador tiene información completa al respecto.

Para que pueda leer la frase "plantilla de clase A" como: A es una plantilla para una clase. A en sí mismo no es una clase. Pero B es una clase, no es una plantilla.

Como la plantilla de clase A no se puede compilar en una biblioteca estática o dinámica para vincularla a sus programas, por lo que A solo se puede enviar como biblioteca header-only con el código fuente completo. Asimismo,

+0

o '.hpp', o' .hxx', o algo más;) –

+0

@VJo: Correcto. :-) – Nawaz

+0

y ¿hay alguna ventaja para hacer esto en términos de velocidad de ejecución, claridad de código, organización, etc.? – flow

4

Algunas bibliotecas toman la forma de un archivo binario que debe vincular con su proyecto, junto con un encabezado archivo que define las clases o funciones disponibles. Una "biblioteca de encabezado único" sería aquella que no incluye ningún archivo binario, solo un encabezado que incluya en su fuente.

Las plantillas son clases o funciones que están personalizadas para su uso particular; típicamente se definen en un archivo de encabezado ya que el compilador debe leer su fuente para personalizarlos. No puede compilar una plantilla en un archivo binario hasta que sepa exactamente cómo se utilizará, por lo que debe incluir la fuente junto con su propio código y el compilador puede procesarlos juntos.

0

Significa que no hay módulos en la biblioteca, solo encabezados. Eso significa que la biblioteca se puede usar sin necesidad de que primero se compile y luego se vincule; solo incluya los encabezados en sus propios módulos fuente.

Los beneficios de este enfoque son

  1. Es más fácil para incluir, ya que no es necesario para especificar las opciones de enlazador en su sistema de construcción.
  2. Siempre compila todo el código de la biblioteca con el mismo compilador (opciones) que el resto de su código, ya que las funciones de la biblioteca se incluyen en su código.
  3. Puede ser mucho más rápido.

En este caso, la estructura de datos del contenedor implementada en el tipo de datos que contiene, por lo que no se puede compilar por completo.

0

Para las bibliotecas de plantillas, es posible proporcionar toda la funcionalidad en solo encabezado (archivos .h) porque tradicionalmente los compiladores necesitaban la definición completa de la clase de plantilla para crear instancias para un tipo determinado. No hay nada que poner en una biblioteca a menos que la biblioteca proporcione versiones preinstantadas o si hay alguna porción de la biblioteca de plantillas que no necesita ser modificada.

0

Es "solo encabezado" porque no contiene archivos .cpp separados, solo archivos .h, por lo que solo puede #include incluir todo el código de la biblioteca en el código.

Esto puede ser una ventaja ya que no es necesario vincularlo con una biblioteca estática which can be very painful.

0

Significa que no tiene que vincular ninguna biblioteca externa durante la fase de enlace de su desarrollo. Solo tiene que descargar la biblioteca y usar las macros #include para usar la biblioteca. Simplifica el despliegue de su aplicación en el futuro, pero a veces a expensas de tiempos de compilación más largos.

3

Significa exactamente que la biblioteca se redistribuyó solo como encabezados. Para usarlo, solo necesita #incluirlo en sus archivos fuente.

1

La respuesta corta es que las plantillas son muy similares a las macros para que el compilador genere el código. Cada vez que crea una instancia (para esample, usando un tipo como std::list<int>), el compilador debe tener el código original para insertar el tipo correcto (en este caso int) en el código de la clase de plantilla. Esta es la razón por la cual las clases de plantilla se incluyen en los archivos .h cada vez que tiene que usarlos en los archivos .cpp.

1

Significa que todo el código está en archivos de encabezado; no hay bibliotecas asociadas con la biblioteca. Lo que eso significa en la práctica depende — en el peor de los casos, significa que el autor nunca ha incluido compiló el código :-). Lo más probable es que significa que el código nunca se ha probado con la combinación exacta de compilador, versión y opciones que utiliza, y que los tiempos de compilación aumentarán. En la otra mano , significa que puede usar la biblioteca incluso si el autor no tiene acceso al mismo compilador que , y no está obligado a usar las opciones que usó cuando compiló la biblioteca.O alternativamente, si es de código abierto, no tiene que compilar la biblioteca usted mismo.

Cuestiones relacionadas