2010-07-27 11 views

Respuesta

5

Deben acortar el tamaño de la fuente (si se reutilizan) pero no el tamaño binario (la plantilla se compila para cada instanciación diferente).

Esto difiere de los genéricos de Java, donde hay un borrado de tipo completo (los genéricos solo sirven como verificación de compilación de tipos) o C#, donde los genéricos se compilan en binarios específicos que se pueden reutilizar directamente sin tener que recompilar y generar mas codigo

0

El tamaño del binario depende de su compilador y de las optimasaciones que el compilador realizará para reducir el tamaño del código eliminando el código relegado.

Los compiladores modernos son capaces de detectar código redundante, por lo que el tamaño del binario no aumentará espectacularmente mediante el uso de plantillas.

+0

Dudo que el compilador pueda hacer algo más con las plantillas que con las funciones sin plantilla. Las plantillas tienen una vinculación externa, por lo que no se pueden eliminar del archivo objeto, y cualquier técnica que pueda usar para reducir el código interno de la plantilla también se usará para código que no tenga una plantilla. –

2

Mi entendimiento es que para cada tipo se ejemplariza con una plantilla del compilador produce la clase correspondiente para que coincida con el tipo - por lo que si se utiliza List<int>, List<foo> y List<float> no será efectiva tres diferentesList clases en su binario cumplido .

Editar:
lo que no estaba explícitamente el estado que estoy inferir que la fusión de varias clases en una sola plantilla será (probablemente) no reducir el tamaño de su binario, pero debería reducir el tamaño de tu fuente

+1

Su comprensión es buena, y también tenga en cuenta que (a menos que instancia manualmente la clase) solo se compilarán los métodos que realmente se utilizan. No lo agregué a mi respuesta, ya que los vinculadores pueden eliminar el código no utilizado del binario, por lo que una optimización de espacio similar está disponible para el código sin plantillas y eso no hace la diferencia. +1 –

0

Las plantillas definitivamente serán una forma de escribir códigos más genéricos y más cortos. En lugar de escribir su función blah n veces para tratar diferentes tipos de parámetros, la escribe una vez con un tipo genérico para el parámetro.

En cuanto al tamaño binario, se generará código para las instancias que haga de la plantilla, es decir, cuando especifique un tipo. No veo cómo podría acortar los tamaños binarios.

2

Depende ... Si fuera a implementar para cada tipo una clase por separado, el tamaño del código fuente disminuirá.

En cuanto a binario, lo más probable es que no veas ninguna diferencia significativa, porque si vas a implementar clases separadas para cada tipo y no lo hiciste porque has usado plantillas, eso no significa que el tamaño binario disminuirá , porque ese código será generado por el compilador (para las instancias), por lo que no debe haber ninguna diferencia significativa porque "el código es el mismo".

Cuestiones relacionadas