A menudo, la gente habla de la llamada de funciones que produce una cierta cantidad de gastos generales , o un conjunto ineludible de preocupaciones y circunstancias adicionales, en un programa. ¿Se puede explicar esto mejor y compararlo con un programa similar sin la llamada a la función?
Depende de la configuración de su compilador y la forma en que optimiza el código. Algunas funciones están en línea. Otros no lo son. Por lo general, depende de si está optimizando el tamaño o la velocidad.
En general, la función de llamada provoca retrasos por dos razones:
El programa necesita conectarse a alguna ubicación aleatoria en la memoria donde comienza el código de su función. Para hacer esto, necesita guardar la posición actual del cursor en una pila para saber a dónde regresar. Este proceso consume más de un ciclo de CPU.
Dependiendo de la arquitectura de su CPU, puede haber una canalización, que obtiene las siguientes instrucciones de la memoria en el caché de la CPU en paralelo con la ejecución de la instrucción actual. Esto es para acelerar la velocidad de ejecución. Cuando llama a una función, el cursor se conecta a una dirección completamente diferente y todas las instrucciones almacenadas en caché se eliminan de la canalización. Esto provoca más retrasos.
También vea aquí y aquí para una discusión sobre cuándo tendría sentido la inserción.
en línea
En general, solo puede sugerirle al compilador que inline una función, pero el compilador puede decidir lo contrario. Sin embargo, Visual Studio ofrece su propia palabra clave forceinline . Algunas funciones no pueden estar en línea, por ejemplo, cuando son recursivas o cuando la función de destino no puede determinarse en tiempo de compilación (llamadas a través de tablas de funciones, llamadas a funciones virtuales en C++).
Le sugiero que confíe en el compilador, independientemente de si una función debe estar en línea o no. Si realmente desea alinear su código, considere usar una macro en su lugar.
Gastos generales
La sobrecarga de memoria es mínima cuando usa funciones porque no duplica el código; el código en línea se duplica en el sitio de la llamada. La sobrecarga de rendimiento en estos días es insignificante porque las arquitecturas modernas son realmente buenas para predecir y llamar con una sobrecarga de aproximadamente 1-2 ciclos solamente.
Las funciones pueden estar en inlined , pero la norma (en su mayoría) es que las funciones están en una dirección particular, y los valores pasados a la función se colocan en la pila y el resultado se coloca en la pila y se devuelve.