El corto de él:
Sí, este enfoque [probablemente] trabajo en circunstancias limitadas y especializadas. No sospecho que std::vector
(o el resto de STL) se encuentran entre esas circunstancias.
El largo de la misma:
Como otros han mencionado (y estoy de acuerdo), fuera de un sistema integrado, el código de la hinchazón no es un gran problema en un binario compilado.
Pero, muchos de nosotros sufrimos el costo de compilación de construir magnitudes más código durante el paso de compilación de lo que podríamos hacerlo si hubiera bibliotecas compiladas para enlazar (en lugar de compilar archivos de encabezado). Añádele la dificultad de cambiar uno de esos archivos de cabecera con plantillas y ver todo el proyecto recompilar desde cero. De largo los tiempos de compilación hacen para los desarrolladores tristes :(
Puede que no afectan a un gran porcentaje de los desarrolladores -.., Dependiendo del tamaño de la base de código de su empresa, y cómo estructurar su entorno de construcción Ciertamente nos grava en mi empresa
Como han señalado algunas respuestas, no hay mucho para abstraer de un std::vector
que lo haría justo mejor en su ejemplo. Ciertamente debe ser capaz de crear y destruir elementos individuales, y hacer cualquier método virtual
obstaculizaría tiempo de ejecución (que es más importante que el rendimiento en tiempo de compilación). Además, el compilador perderá la capacidad de optimizar la biblioteca void*
para el código de plantilla, esto podría resultar en una gran e pérdida de rendimiento.
Estoy más interesado en las estructuras más complejas - ¿se beneficiaría std::map
de la abstracción? ¿Qué sucede si saca el árbol rojo-negro (la implementación de SGI) y lo vincula con una biblioteca de árbol rojo-negro?Debería (probablemente) almacenar los elementos fuera del std::map
, por lo que no es necesario llamar a los destructores, pero eso podría (nuevamente) causar una pérdida de rendimiento en tiempo de ejecución debido a duplicar su indirección.
Estoy bastante seguro de que no se podía utilizar este método para mejorar la implementación de STL.
Si tuviera un mejor conocimiento de las estructuras de datos que almacenaban, o que tenía un tipo muy específico de plantilla (no necesariamente un contenedor), que probablemente podría mejorar su rendimiento. Pero, entonces, la pregunta es: ¿con qué frecuencia usará este nuevo tipo de plantilla para que la sobrecarga de la compilación se mejore notablemente? Ciertamente, ayudaría a compilar tiempos para std::vector
, pero quizás no para my_domain_specific_ptr_container
. Si ahorra el 50% del tiempo de compilación para my_domain_specific_ptr_container
, ¿cuántas veces tendría que usarlo para notar un aumento de compilación lo suficientemente significativo como para justificar la complejidad agregada a la clase (y la capacidad de depuración reducida).
Si no lo ha hecho, su tiempo puede ser mejor gastado en la distribución de sus herramientas de construcción :)
Si, por el contrario, se intenta esto y que funciona para contenedores STL ... Por favor después de vuelta. ¡Quiero una compilación más rápida! ;)
Este código no funciona como está, ya que todos los miembros 'vectorBase' son' privados', por lo tanto inaccesibles desde clases derivadas. –
Y falta ';' en todas partes pero tenemos el punto. +1 pregunta interesante. – ereOn
sí, sé que este código no se compilará. no me importa;) No quiero pegar un stl contenedores enteros ... – benoitj