placas mrelberni microcontroladores linea isp comandos caracteristicas c++ visual-studio header inline

mrelberni - C++: funciones en línea y generación de código de tiempo de enlace



mrelberni avr (5)

Hasta hace un tiempo, mi código base estaba muy cerca de #include hell. Cada vez que cambio un archivo .h medianamente importante, prácticamente todos los archivos se vuelven a compilar.
La razón principal de tal alta dependencia del encabezado es que tengo muchas funciones pequeñas que deben estar en línea y tuve la impresión de que para trabajar en línea necesitan estar en la misma unidad de traducción que el código de llamada, por lo que deben estar en el encabezado Para la función en línea incluso para compilar otros encabezados deben incluirse también en el encabezado, ad infimum.

Introduzca la generación de código de tiempo de enlace (en Visual Studio). Una de las principales ventajas declaradas de esto es que ahora la función en línea puede cruzar unidades de traducción.
Pero todavía soy dudoso. ¿Cómo puedo estar realmente seguro de que estas funciones realmente estén incluidas? Me doy cuenta de que el compilador básicamente puede hacer lo que quiera sin importar dónde defina la función.

¿Hay alguna manera de verificar qué se incluye?


Nunca puede estar seguro de que las funciones están en línea. Depende del compilador elegir eso. Pero puede hacer que sea más fácil para el compilador al permitirle encontrar el código objeto asociado con la función.

Ahí es donde entra en juego la generación de código de tiempo de enlace. Los compiladores ya no generan código objeto, generan una forma de lenguaje intermedio y es el vinculador el que realmente compila el código.

Para comprobar lo que se incluye, me temo que se está generando generación de ensamblaje junto con su código objeto. Eso le permite leer el código de objeto exacto producido cuando se invoca una determinada función y quedará muy claro si hay una "llamada" allí o no.


Sé que es un tabú en C ++ decir esto, pero podría implementar las funciones como macros de preprocesador. Discúlpenme mientras voy a lavarme la boca con jabón.


Seguramente no te importa si las cosas se incorporan; solo te importa si el rendimiento es satifactorio. Pero si realmente quiere averiguarlo, examine el código que genera el compilador. Puede hacer esto más fácilmente a través del depurador, usando una ventana de vista de ensamblador.


Una forma relativamente fácil es usar un generador de perfiles. Si una función está en línea, no la verá en el flujo del gráfico de control.


Una vez que tenga el ejecutable, puede usar herramientas para inspeccionarlo y buscar los nombres de las funciones en línea en las tablas de símbolos. Una de esas herramientas que es muy útil es Dependency Walker .

Por supuesto, esto supone que puede obtener una compilación que combine ambas configuraciones de optimización suficientes para que el compilador se moleste con la alineación, a la vez que conserva los símbolos.

Para Visual Studio, creo que las compilaciones "Release" a menudo coinciden con esas, pero no estoy del todo seguro.