c++ - libreria - ¿Por qué no todas las bibliotecas de impulso solo encabezan?
descargar boost (1)
Diferentes puntos, supongo.
- Tamaño binario ¿Podría el encabezado solo poner una carga de tamaño en el cliente?
- Tiempos de compilación ¿Podría solo encabezado significar una disminución significativa en el rendimiento de compilación?
- Runtime Performance. ¿Podría el encabezado solo ofrecer un rendimiento superior?
- Restricciones ¿El diseño requiere encabezado solo?
Acerca del tamaño binario.
y un poco de seguridad
Si hay una gran cantidad de código alcanzable en la biblioteca de impulso, o un código sobre el cual el compilador no puede discutir si es alcanzable por el cliente, debe colocarse en el binario final. (*)
En los sistemas operativos que tienen administración de paquetes (por ejemplo RPM o .deb), las bibliotecas compartidas pueden significar una gran disminución en el tamaño de la distribución binaria y tener una ventaja de seguridad: las soluciones de seguridad se distribuyen más rápido y luego todas las utilizan. Usuarios de .DLL. Así que tenía una recompilación y una redistribución, pero N especuladores. Con una biblioteca de solo encabezado, tiene N recompilaciones, N redistribuciones, siempre para cada corrección, y algunos miembros de esas N ya son enormes en sí mismas.
(*) alcanzable aquí significa "potencialmente ejecutado"
Acerca de los tiempos de compilación.
Algunas bibliotecas de impulso son enormes. Si #include
todo, cada vez que cambie un poco en su archivo fuente, debe recompilar todo lo que #include
d.
Esto se puede contra medir con los encabezados escogidos con cereza, por ejemplo
#include <boost/huge-boost-library.hpp> // < BAD
#include <boost/huge-boost-library/just-a-part-of-it.hpp> // < BETTER
pero a veces las cosas que realmente necesitas incluir ya son lo suficientemente grandes como para paralizar tus recompilaciones.
La contramedida es convertirla en una biblioteca estática o compartida, que a su vez significa "compilar completamente exactamente una vez (hasta la próxima actualización de impulso)".
Acerca del rendimiento en tiempo de ejecución.
Aún no estamos en una era en la que la optimización global resuelva todos nuestros problemas de rendimiento en C ++. Para asegurarse de darle al compilador toda la información que necesita, puede hacer cosas solo de encabezado y dejar que el compilador tome decisiones de encuadernación.
En ese sentido, tenga en cuenta que la inlining proporciona un rendimiento no siempre superior debido a problemas de almacenamiento en caché y especulación en la CPU.
Tenga en cuenta también que este argumento es principalmente con respecto a las bibliotecas de refuerzo que se pueden usar con la frecuencia suficiente, por ejemplo, uno podría esperar que boost::shared_ptr<>
se use con mucha frecuencia y, por lo tanto, sea un factor de rendimiento relevante.
Pero considere la real y única razón relevante boost::shared_ptr<>
es solo encabezado ...
Sobre las restricciones.
Algunas cosas en C ++ no se pueden poner en bibliotecas, a saber, plantillas y enumeraciones.
Pero tenga en cuenta que esto solo es a mitad de camino. Puede escribir interfaces seguras y con plantillas para sus estructuras de datos y algoritmos reales, que a su vez tienen su implementación genérica de tiempo de ejecución en una biblioteca.
Del mismo modo, algunas cosas en C ++ deberían incluirse en los archivos de origen y, en el caso de impulsar, las bibliotecas. Básicamente, esto es todo lo que daría errores de "definición múltiple", como variables de miembros static
o variables globales en general.
Algunos ejemplos también se pueden encontrar en la biblioteca estándar: std::cout
se define en el estándar como extern ostream cout;
, y por lo tanto, cout
básicamente requiere la distribución de algo (library o sourcefile) que lo define una sola vez .
¿Por qué todas las lib en Boost no son solo encabezados? Dicho de otra manera, ¿qué hace obligatorio el uso de .lib / .dll?
¿Es cuando una clase no puede ser plantilla o tiene campos estáticos?