¿Las plantillas de c ++ hacen que los progtwigs sean lentos?

He escuchado de muchas personas que el uso de plantillas hace que el código sea lento. ¿Es realmente cierto? Actualmente estoy construyendo una biblioteca. Hay lugares donde si no se crean plantillas, se produciría un problema de administración del código. A partir de ahora puedo pensar dos soluciones a este problema:

  • use #defines

  • Use plantillas y defina todos los tipos posibles en el archivo de encabezado / biblioteca en sí, pero no permita que el usuario final cree instancias de plantilla.

por ejemplo, typedef Graph GraphI32; etc.

¿Hay alguna forma de evitar que el usuario cree varias instancias de plantilla por su cuenta?

La ayuda en las consultas anteriores sería muy apreciada.

La respuesta corta es no. Para la respuesta más larga, sigue leyendo.

Como otros ya han notado, las plantillas no tienen una penalización directa en el tiempo de ejecución, es decir, todos sus trucos ocurren en tiempo de comstackción. Indirectamente, sin embargo, pueden ralentizar las cosas en algunas circunstancias. En particular, cada instanciación de una plantilla (normalmente) produce código que es separado y único de otras instancias. Bajo algunas circunstancias, esto puede llevar a una ejecución lenta, simplemente produciendo suficiente código objeto que ya no cabe en el caché.

Editar: para aclarar la situación con respecto al tamaño del código: sí, la mayoría de los comstackdores pueden doblar juntos el código para instancias idénticas , pero ese es normalmente el caso cuando las intantiaciones son verdaderamente idénticas. El comstackdor no insertará código para hacer incluso las conversiones más triviales para que el uso encaje con una creación de instancias existente. Por ejemplo, una llamada a función normal puede / convertirá T * a T const * para que las llamadas que usan argumentos const o no const utilizarán el mismo código (a menos que haya elegido sobrecargar la función en const ness, en cuyo caso probablemente lo haya hecho específicamente para proporcionar un comportamiento diferente para los dos casos). Con una plantilla, eso no sucederá: las instancias sobre T * y T const * generarán dos partes de código completamente separadas. Es posible que el comstackdor (o el enlazador) pueda fusionar los dos después del hecho, pero no del todo seguro (por ejemplo, ciertamente he usado comstackdores que no lo hicieron).

Las plantillas tienen efectos positivos sobre la velocidad mucho más a menudo que las negativas.

Dado que la creación de instancias de plantilla ocurre en tiempo de comstackción, no hay costo de tiempo de ejecución para usar plantillas (de hecho, las plantillas se usan a veces para realizar ciertos cálculos en tiempo de comstackción para hacer que el progtwig se ejecute más rápido). Sin embargo, el uso intensivo de plantillas puede conducir a largos tiempos de comstackción.

No, no lo hacen. Cuando encuentre que ha “escuchado” algo y no puede nombrar la fuente, casi con seguridad podrá garantizar que lo que ha escuchado es incorrecto. De hecho, las plantillas tienden a acelerar el código.

En lugar de depender de escuchar cosas, es una buena idea leer un libro autoritativo sobre el tema – Recomiendo Plantillas C ++ – La Guía Completa .

La plantilla hace que la Comstackción sea lenta. Pero la mayoría de las veces hace que el progtwig sea más rápido.

Aumentan el código objeto, porque C ++ genera código para cada tipo que use. Pero no creo que esto ralentice la velocidad de ejecución. No tengo números para sugerir que lo haga.

Ciertamente mejora tu suerte en la vida durante el desarrollo del código, la lectura y el mantenimiento. No permitiría que la encoding de los mitos urbanos lo desanime a utilizar una función de lenguaje que sea claramente útil.