C agregó la palabra clave en línea que puede anteponer una definición de función, como:
inline int max_int( int a, int b ) { return a > b ? a : b; }
para darle al compilador una “pista” de que el programa en general podría beneficiarse en rendimiento si la función está incluida.
Se ha expandido el código de una función que ha sido incluida en cada punto en el que se ha llamado en lugar de realizar el mecanismo normal de llamada a función de:
Para funciones muy pequeñas, la incorporación en línea puede generar una ganancia de rendimiento. Pero como casi todo lo demás, existen compensaciones.
La palabra clave en línea se transfirió a C99, pero con requisitos ligeramente diferentes; hablaremos más adelante.
Las funciones en línea son como macros similares a funciones (y están destinadas a reemplazar muchos usos de ellas). Generalmente, esto es bueno porque las funciones en línea son funciones y tienen una semántica de función completa en lugar de una mera sustitución de texto realizada por el preprocesador que no entiende ni C ni C.
Una macro ingenuamente equivalente a la función max_int():
#define MAX_INT(A,B) A > B ? A : B /* bad implementation */
tiene los siguientes problemas:
Además, una macro:
Las funciones en línea no tienen ninguno de estos problemas pero pueden generar el mismo beneficio de rendimiento. Por lo tanto, utilice funciones en línea en lugar de macros similares a funciones.
Como se mencionó, especificar en línea es solo una "pista" para el compilador de que el programa en general podría beneficiarse en el rendimiento de la función incorporada. El compilador es libre de ignorar la pista.
¿Por qué? Porque hay casos en los que o no es una buena idea o es imposible. Una función no está integrada o normalmente no está integrada cuando se cumple cualquiera de las siguientes condiciones:
Puede haber otras razones. Todo depende en gran medida de la función, sus argumentos, el compilador y las opciones que se le den.
Si el compilador no puede o elige no incluir una función, no le advierte que no lo ha hecho (de forma predeterminada). Algunos compiladores, por ejemplo, gcc, tienen una opción -Winline que le advertirá y le dará la razón por la cual una función no estaba incorporada.
Especificar en línea es similar al código anterior que especifica registro; ambos son solo sugerencias.
Para la mayoría de las funciones, la mayor parte del costo de ejecutar la función está en el cuerpo de la función, no en el mecanismo de llamada a la función. Por lo tanto, para que una función sea una buena candidata para la inserción, generalmente tiene que ser:
En caso de duda, perfila tu código. Usar en línea no una palabra clave mágica para "hacerme más rápido". Además, el uso excesivo de elementos en línea puede generar un exceso de código que, además, empeora el rendimiento de su programa en general.
Para obtener más información, consulte La enfermedad en línea.
Las funciones que suelen ser buenas candidatas para la incorporación incluyen:
Una función en línea ideal aumenta el rendimiento y disminuye el tamaño del código.
Sin embargo, una advertencia para cualquier función en línea es que si su definición cambia, será necesario volver a compilar todo el código que la utiliza.
Si el compilador realmente incluye una función en línea, entonces, además de omitir el código para el mecanismo normal de llamada a función, el compilador también puede:
Para que el compilador pueda incorporar una función, debe poder “ver” su definición (no solo su declaración) en cada archivo .c o .cpp en el que se utiliza. como una macro. Por lo tanto, una función en línea debe estar definida en un archivo de encabezado.
Normalmente, una función, como todo lo demás, debe tener exactamente una definición al adherirse a la regla de una definición (ODR). Sin embargo, dado que la definición de una función en línea se "ve" en varios archivos .c o .cpp, el ODR se suspende para esa función.
Es posible tener diferentes definiciones para funciones en línea que tienen el mismo nombre, pero esto da como resultado un comportamiento indefinido ya que el compilador no tiene forma de verificar que todas las definiciones sean iguales.
Para insertar una función en C, todo lo que necesita hacer es prefijar la definición de la función con inline, eso es todo. El compilador y/o vinculador descartará automáticamente todas las definiciones menos una del archivo ejecutable final.
Sin embargo, para alinear una función en C, además debe decirle explícitamente al compilador en qué archivo .o colocar la definición en caso de que el compilador no pueda o no quiera alinear una función mediante externo en línea.
Por ejemplo, en exactamente un archivo .c, declararías una función como:
// util.c extern inline int max_int( int, int );
Eso le dice al compilador que "ponga una definición para max_int() en util.o".
Como alternativa, en C, también puedes declarar estática una función en línea:
static inline int max_int( int a, int b ) { return a > b ? a : b; }
Si haces esto, entonces:
Las funciones en línea, si se usan con prudencia, pueden generar mejoras en el rendimiento. Generalmente, sólo las funciones muy pequeñas son buenas candidatas para la inserción.
A partir de C 11, las funciones en línea también se pueden declarar constexpr, pero esa es una historia para otro momento.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3