pastillas - ¿Qué significa__inline__?
inline pastillas (5)
Básicamente, es una pista para el compilador; es una sugerencia de que, cuando se utiliza esta función, podría ser posible insertar el código directamente.
la idea es que hacerlo podría ser más eficiente, ya que evita la sobrecarga de una llamada de función; pero, en última instancia, el compilador utiliza una combinación de tamaño de código, opciones de optimización especificadas y un poco de vudú para decidir si realmente respetar esta sugerencia.
La parte vudú es la parte más confusa. :) no necesariamente confíe en __inline__
(o la más estándar en línea) para trabajar; Optimice sus algoritmos o reorganice su código en su lugar si realmente le importa la velocidad.
Estoy tratando de aprender C. Leyendo un código, encontré una línea como esta:
__inline__ void () ...
¿Qué significa el __inline__
? ¿Cómo poner esa palabra delante de una función la hace diferente?
Inline es una sugerencia para que el compilador incorpore la función: en lugar de generar un bloque de código para la función y call
instrucciones de call
donde sea que se utilice, efectivamente corta y pega el código generado donde sea que se llame esa función.
Por lo general, solo es una sugerencia: aunque puede aumentar el rendimiento si se le llama en un bucle cerrado, por lo general aumenta el uso de la memoria, lo que puede tener efectos negativos en el rendimiento. El compilador tomará su propia decisión sobre si incluir una función en línea o no, podría tomar en cuenta "el programador sugiere que se incorpore esto", pero (en la mayoría de los compiladores), simplemente declarar una función como en línea no garantiza que lo sea.
La declaración __inline__
le dice al compilador que donde sea que se llame a la función para "en línea" la función en su lugar. La inclusión en línea es similar a usar una macro: el código se expandirá como si lo hubiera escrito todo en el lugar donde llamó a la función.
Vea los documentos de GNU para más información.
En informática , una función en línea es una construcción de lenguaje de programación que se utiliza para indicar a un compiler que debe realizar una expansión en línea en una función en particular. En otras palabras, el compilador insertará el cuerpo completo de la función en cada lugar del código donde se usa esa función.
Si está escribiendo un archivo de encabezado para incluirlo en los programas ISO C89, escriba
__inline__
lugar deinline
. Ver palabras clave alternativas .
__inline__
es una extensión no estándar . Por lo general, le dice al compilador: "inline esta función", pero al ser una extensión no estándar, no podemos decir con certeza a menos que sepamos en qué compilador está activado.
Inline es eliminar la llamada a la función y colocar su contenido directamente donde se realizará la llamada. Esto a menudo elimina la sobrecarga de llamar a una función. No siempre es óptimo, debido a la gran cantidad de código (el código es demasiado grande y no se ajusta a la memoria caché), por lo que la mayoría de los compiladores ignorarán todas las directivas en línea y harán lo que crean que es mejor. Ésto es una cosa buena. Nosotros los humanos somos muy pobres en ese tipo de cosas, y generalmente se considera una mala práctica decirle al compilador cómo hacer su trabajo.
La inclusión es una optimización importante, especialmente con la presencia de funciones auxiliares. Imagina una función que devuelve el menor de dos ints:
int min(int x, int y)
{
return (x < y) ? x : y;
}
Si usara esta función en mi código, sería una enorme pérdida de tiempo hacer una llamada de función, aquí. Si tuviera:
int a = /* some calculation */;
int b = /* some other calculation */;
int minCalc = min(a, b);
Y el compilador incorporó esa función, el código se convertiría en:
int a = /* some calculation */;
int b = /* some other calculation */;
int minCalc = (a < b) ? a : b;
Lo que elimina la sobrecarga de llamar a una función. Desde aquí, se pueden hacer aún más optimizaciones a medida que el compilador trabaje directamente con el código que normalmente se habría escondido detrás de una llamada de función. Como puede ver, si tengo una función grande y fuerzo al compilador a integrarlo en todas partes, el tamaño del código podría crecer muy rápidamente y dificultaría la velocidad de ejecución.
Existe una palabra clave en inline
estándar que se usó para indicar al compilador que una función debe estar en línea, pero en la actualidad la mayoría de los compiladores ni siquiera la reconocen como una sugerencia para integrar la función.
Sin embargo, hay un efecto secundario importante de la inline
, y esto puede ser útil. Si una función está marcada como en inline
, las definiciones múltiples de la misma función en varias unidades de traducción no son un error. En su lugar, se selecciona una única función y se descartan las demás, y se asume que son las mismas (¡depende de usted asegurarse de que esto esté bien!). Esto le permite definir una función dentro de un archivo de encabezado sin riesgo de errores de violación de ODR.