Bueno, primero demuelemos algunos de sus supuestos:
- Una de las ventajas de las bibliotecas de solo encabezado para C ++ es que no necesitan compilarse por separado.
Compilar cosas por separado significa potencialmente no tener que volver a compilar todo si solo cambia una parte.
Entonces, una desventaja en lugar de una ventaja.
- En C y C ++ en línea solo tiene sentido si la función se define en un archivo de encabezado *.
Sí, el único efecto que inline
queda es la excepción a la regla de una definición .
¡Ay de ustedes si esas definiciones son diferentes de alguna manera!
Entonces, si una función es interna a una unidad de compilación, márquela static
. Eso también hace que la alineación sea más probable, ya que la función debe estar disponible para alinearla.
Aún así, eche un vistazo a la optimización del tiempo de enlace, como lo respaldan al menos MSVC ++, gcc y clang.
- Tradicionalmente, en C, se ha utilizado el diseño .c / .h, donde el encabezado representa la interfaz pública mínima de la unidad de traducción. Del mismo modo, .cpp / hpp.
Bueno, solo presentar la interfaz mínima es sin duda uno de los objetivos, lograr una mayor estabilidad API y ABI, y minimizar los tiempos de compilación.
Sin embargo, especialmente las clases de C ++ no están realmente orientadas a eso, ya que todos los bits privados se filtran en el encabezado, al igual que los protegidos, ya sea que desee derivarlos o no.
El patrón de diseño PIMPL es para reducir tales detalles.
Sin embargo, la parte donde la separación de la interfaz y la implementación falla por completo en C ++ son las plantillas.
El comité intentó hacer algo con las plantillas exportadas , pero eso ha sido abandonado como demasiado complicado y realmente no funciona.
Ahora, están trabajando en un sistema de módulos adecuado , aunque es lento. Eso reduce drásticamente los tiempos de compilación, y también debería aumentar la estabilidad API y ABI al disminuir su superficie.
¿Las bibliotecas de solo encabezado son generalmente más eficientes en cuanto a código y tiempo de ejecución que el diseño tradicional? Si es así, ¿se debe a una amplia línea u otras optimizaciones?
Las bibliotecas de solo encabezado pueden ser más eficientes en tamaño de código y tiempo de ejecución, aunque eso depende de si la biblioteca se comparte, cuánto se usa, de qué maneras y si la inclusión en línea demuestra una victoria decisiva en ese caso específico.
Y la razón por la que la alineación es tan importante para la optimización no es porque la alineación en sí misma sea un gran impulso, sino que se abre debido a las oportunidades de propagación constante y una mayor optimización.