una que personal negocio modelo mision gratis empresas empresa ejemplos definicion cuenta crear c++ templates c++11

c++ - que - modelo de negocio digital definicion



C++ 11: Declaración de creación de instancias explícita frente a definición de creación de instancias explícita (2)

¿Cuál es la diferencia entre la definición de creación de instancias de la plantilla explícita de C ++ 03 y la declaración de creación de instancias de la plantilla explícita de C ++ 11?

Lo que quiero decir es por qué la definición de creación de instancias no es suficiente para evitar que el compilador genere la implementación para otros tipos. Lo que está mal en el siguiente ejemplo: imagine que divido la declaración y la definición de la plantilla en dos archivos separados:

Ah

#pragma once template<typename T> class A { public: A(T t); private: T _t; };

A.cpp

#include "A.h" template<typename T> A<T>::A(T t) : _t(t) {} template class A<int>; // explicit instantiation

main.cpp

#include "A.h" int main() { A<int> a(5); // fine, compiler generates header file, // linker links with implementation from A.cpp file // A<float> b(3.14f); // linker error, as expected }

¿Hay alguna sobrecarga de tiempo de compilación en el ejemplo anterior? Si entiendo correctamente, en tal caso, al utilizar la definición de creación de instancias explícita en un archivo * .cpp separado (junto con la implementación de la plantilla), hago que el compilador no pueda instanciar implícitamente la plantilla con ningún otro tipo. Como tal, ¿por qué hay una sintaxis separada para la declaración de creación de instancias explícita?

¿Cómo puede la declaración de creación de instancias explícita acelerar el tiempo de compilación, si ya PODRÍA haber ocultado la implementación en el archivo A.cpp utilizando la definición de creación de instancias explícita e impedido que el compilador genere el cuerpo para otros tipos? ¿La "declaración de creación de instancias explícita" está relacionada de alguna manera con la "definición de creación de instancias explícita"? Quiero decir, ¿debería usar ambas, o estas son características completamente separadas (por ejemplo, la declaración de creación de instancias explícita solo se puede usar si no se ha utilizado la definición de creación de instancias explícita)?

¿Estoy pensando correctamente, que la definición de creación de instancias explícita es solo para desencadenar un error en caso de que ninguna otra unidad de traducción cree una instancia de la plantilla utilizando el tipo dado?


Una declaración de creación de instancias explícita (una plantilla externa) omite el paso de creación de instancias implícita: el código que de otro modo causaría una creación de instancias implícita en su lugar utiliza la definición de creación de instancias explícita proporcionada en otro lugar (que da como resultado errores de enlace si no existe dicha creación de instancias). Esto se puede usar para reducir los tiempos de compilación declarando explícitamente una creación de instancias de plantilla en todos los archivos de origen menos uno que lo usa, y definiéndolo explícitamente en el archivo restante. Source

En este caso, una declaración en main.cpp o Ah hubiera impedido que main.cpp generara (en tiempo de compilación) un código basado en qué partes de la plantilla son visibles, es decir, una especialización A<int> basada en Ah :

class A<int> { public: A(int t); private: int _t; };

Sin embargo, el código main.cpp necesita saber que A<int>::A(int) existe, lo que significa que debe realizar algún tipo de creación de instancias para aprender todos los miembros de A<int> , que es exactamente lo que un Ah based A<int> instanciación de A<int> haría.

Así que sí, no es exactamente obvio cómo es útil aquí, aunque está sujeto a perfiles por compilador / plataforma.


Cuando coloca una definición de A.cpp instancias explícita en el archivo A.cpp , ¿cómo se supone que el compilador sepa que está ahí cuando compila main.cpp ? La respuesta es que no puede, por lo que aún sería una instancia de las plantillas usadas en main.cpp , y en su caso, usar la definición de creación de instancias explícita es inútil y no ayuda.

Una declaración de una instanciación explícita le dice al compilador "no se moleste en crear una instancia de esta plantilla, lo haré yo mismo, en otra parte del programa", y la definición es lo que cumple esa promesa.

La creación de instancias explícita debe definirse exactamente una vez, en un solo archivo, pero se puede declarar varias veces en archivos diferentes. Esto no es exclusivo de las plantillas, en C y C ++ las mismas reglas se aplican a las funciones (no en línea): puede declararlas varias veces en diferentes archivos (generalmente colocando la declaración en un encabezado) y luego debe definir la función exactamente una vez, en un archivo.

Entonces, para que su ejemplo funcione correctamente, debe agregar una declaración en Ah :

extern template class A<int>; // explicit instantiation declaration