for c++ linker virtual llvm

c++ - for - llvm 3.7 0



Método virtual fuera de línea (1)

El compilador debe emitir un vtable para clases con métodos virtuales. Esto contiene los indicadores de estos métodos. Si todos los métodos virtuales están en línea (definidos en el encabezado), entonces el compilador no sabe qué unidad de traducción (archivo .cpp) para emitir el vtable dentro, por lo que emite una copia en todos ellos y el vinculador se encarga de con eso. Esto hace que el trabajo extra y la hinchazón en los archivos de objeto. Si, por otro lado, una función virtual se define fuera de línea (en un .cpp), el vtable puede emitirse allí y, por lo tanto, solo se emitirá una copia. Lo mismo se aplica al RTTI.

¿Qué es exactamente un método virtual fuera de línea y por qué afecta los tiempos de enlace?

http://llvm.org/docs/CodingStandards.html dice

Si una clase se define en un archivo de cabecera y tiene un vtable (o tiene métodos virtuales o deriva de clases con métodos virtuales), siempre debe tener al menos un método virtual fuera de línea en la clase. Sin esto, el compilador copiará el vtable y el RTTI en cada archivo .o que # incluya el encabezado, distorsione los tamaños de archivo .o y aumente los tiempos de enlace.