Hay dos decisiones separadas un poco el compilador hace en relación con la función de procesos en línea:
- si se colocarán en línea una llamada función particular;
- si existe una versión no en línea de la función.
El primero es decidido por el compilador caso por caso, si la línea es posible en ese momento. No será posible si la función es virtual, o se llama a través de un puntero de función, y no puede determinar en tiempo de compilación a qué función se llamará. No será posible si la definición no está disponible para el compilador, quizás porque está definida en una unidad de traducción diferente y el compilador no hace "optimización de todo el programa". La decisión puede estar o no influenciada por si la función está declarada inline
y otros factores, como su tamaño y la frecuencia de su llamada.
El segundo depende de si se requiere una versión no en línea. Será necesario si alguna llamada no está en línea. También será necesario (según su presupuesto) si algo necesita la dirección de la función, ya que debe tener una dirección. Esto puede suceder directamente (por ejemplo, asignando la dirección a un puntero de función) o indirectamente (por ejemplo, las funciones virtuales necesitarán su dirección almacenada en algún lugar para buscar el tiempo de ejecución de acuerdo con el tipo dinámico del objeto).
La existencia de la versión no en línea no evitará que se inline ninguna llamada particular a la función, aunque es posible que pueda influir en la decisión del compilador, especialmente si está configurado para optimizar el tamaño del código.
En resumen, su presupuesto es simplista y no del todo exacto; el compilador aún puede "ejecutar en línea" si se toma la dirección, simplemente no puede omitir la versión que no está en línea.
Oh Odio este nuevo sistema gratuito de votos negativos. ¿Qué demonios estaba mal con esta pregunta, gente? –
Por curiosidad, ¿qué libro está haciendo esa afirmación? –
+1 para contrarrestar anónimo drive-by downvoter –