¿Cuáles son las ventajas / desventajas de usar funciones en línea en C ++? Veo que solo aumenta el rendimiento del código que genera el compilador, pero con los compiladores optimizados de hoy, CPU rápidas, memoria enorme, etc. (no como en 1980 <donde la memoria era escasa y todo tenía que caber en 100 KB de memoria) qué ¿Qué ventajas tienen realmente hoy?
c++
inline-functions
Lennie De Villiers
fuente
fuente
inline
sea una palabra clave de c ++ y que la alineación sea una técnica de optimización del compilador. Consulte esta pregunta " cuándo debo escribir la palabra claveinline
para una función / método " para obtener la respuesta correcta.Respuestas:
Las funciones en línea son más rápidas porque no es necesario presionar y abrir elementos de la pila como parámetros y la dirección de retorno; sin embargo, hace que su binario sea un poco más grande.
¿Hace una diferencia significativa? No es lo suficientemente notable en el hardware moderno para la mayoría. Pero puede marcar la diferencia, que es suficiente para algunas personas.
Marcar algo en línea no le garantiza que estará en línea. Es solo una sugerencia para el compilador. A veces no es posible, como cuando tiene una función virtual o cuando hay recurrencia involucrada. Y a veces el compilador simplemente elige no usarlo.
Pude ver una situación como esta haciendo una diferencia detectable:
fuente
Ventajas
Desventajas
Magia en línea
return 42 ;
enunciado. Esto es para mí una línea extrema . Sucede raramente en la vida real, alarga el tiempo de compilación, no hinchará su código y lo hará más rápido. Pero al igual que el grial, no intente aplicarlo en todas partes porque la mayoría del procesamiento no se puede resolver de esta manera ... Aún así, esto es genial de todos modos ...:-p
fuente
3.2/6: There can be more than one definition of [..] inline function with external linkage [..] non-static function template
. En 5.1.5 / 6For a generic lambda, the closure type has a public inline function call operator member template
. Y en7.1.2/2: the use of inline keyword is to declare an inline function
donde es una sugerencia alinear el cuerpo de la función en el punto de llamada. Por lo tanto, concluyo que incluso si pueden comportarse de la misma manera, las funciones en línea y las plantillas de función siguen siendo nociones ortogonales separadas que se pueden mezclar (es decir, plantilla de función en línea)En arcaico C y C ++,
inline
es comoregister
: una sugerencia (nada más que una sugerencia) al compilador sobre una posible optimización.En C ++ moderno,
inline
le dice al enlazador que, si se encuentran múltiples definiciones (no declaraciones) en diferentes unidades de traducción, son todas iguales, y el enlazador puede conservar libremente una y descartar todas las demás.inline
es obligatorio si una función (no importa cuán compleja o "lineal") se defina en un archivo de encabezado, para permitir que múltiples fuentes la incluyan sin que el vinculador obtenga un error de "definición múltiple".Las funciones miembro definidas dentro de una clase son "en línea" de forma predeterminada, al igual que las funciones de plantilla (en contraste con las funciones globales).
Tenga en cuenta la inclusión de fileA.h en dos archivos .cpp, lo que da como resultado dos instancias de
afunc()
. El enlazador descartará uno de ellos. Si noinline
se especifica, el vinculador se quejará.fuente
Inline es una sugerencia para el compilador que es libre de ignorar. Es ideal para pequeños fragmentos de código.
Si su función está en línea, básicamente se inserta en el código donde se realiza la llamada a la función, en lugar de llamar a una función separada. Esto puede ayudar con la velocidad ya que no tiene que hacer la llamada real.
También ayuda a las CPU con la canalización, ya que no tienen que volver a cargar la tubería con nuevas instrucciones causadas por una llamada.
La única desventaja es el aumento del tamaño binario, pero, siempre que las funciones sean pequeñas, esto no importará demasiado.
Tiendo a dejar este tipo de decisiones a los compiladores hoy en día (bueno, las inteligentes de todos modos). Las personas que los escribieron tienden a tener un conocimiento mucho más detallado de las arquitecturas subyacentes.
fuente
La función en línea es la técnica de optimización utilizada por los compiladores. Simplemente se puede anteponer una palabra clave en línea al prototipo de función para hacer una función en línea. La función en línea indica al compilador que inserte el cuerpo completo de la función siempre que esa función se haya utilizado en el código.
Ventajas: -
No requiere función llamando a la sobrecarga.
También ahorra sobrecarga de variables push / pop en la pila, mientras que la función llama.
También ahorra gastos generales de devolución de llamada de una función.
Aumenta la localidad de referencia mediante el uso de caché de instrucciones.
Después del compilador en línea también puede aplicar la optimización intraprocesal si se especifica. Este es el más importante, de esta manera el compilador ahora puede enfocarse en la eliminación de código muerto, puede dar más énfasis en la predicción de ramificación, eliminación de variables de inducción, etc.
Para ver más al respecto, puede seguir este enlace http://tajendrasengar.blogspot.com/2010/03/what-is-inline-function-in-cc.html
fuente
Me gustaría agregar que las funciones en línea son cruciales cuando construyes una biblioteca compartida. Sin marcar la función en línea, se exportará a la biblioteca en forma binaria. También estará presente en la tabla de símbolos, si se exporta. Por otro lado, las funciones en línea no se exportan, ni a los binarios de la biblioteca ni a la tabla de símbolos.
Puede ser crítico cuando la biblioteca está diseñada para cargarse en tiempo de ejecución. También puede afectar a las bibliotecas compatibles con binarios compatibles. En tales casos, no use en línea.
fuente
inline
al construir una biblioteca compartida!Durante la optimización, muchos compiladores incluirán funciones en línea incluso si no las marcó. Por lo general, solo necesita marcar las funciones como en línea si sabe algo que el compilador no sabe, ya que generalmente puede tomar la decisión correcta.
fuente
inline
le permite colocar una definición de función en un archivo de encabezado y#include
ese archivo de encabezado en varios archivos de origen sin violar la regla de una definición.fuente
En términos generales, en estos días, con cualquier compilador moderno preocuparse por incluir algo es una pérdida de tiempo. El compilador debería optimizar todas estas consideraciones para usted a través de su propio análisis del código y su especificación de los indicadores de optimización pasados al compilador. Si le importa la velocidad, dígale al compilador que optimice la velocidad. Si le importa el espacio, dígale al compilador que optimice el espacio. Como se mencionó en otra respuesta, un compilador decente incluso se alineará automáticamente si realmente tiene sentido.
Además, como han dicho otros, usar inline no garantiza inline de nada. Si desea garantizarlo, tendrá que definir una macro en lugar de una función en línea para hacerlo.
¿Cuándo en línea y / o definir una macro para forzar la inclusión? - Solo cuando tiene un aumento demostrado y necesario en la velocidad de una sección crítica de código que se sabe que afecta el rendimiento general de la aplicación.
fuente
No se trata solo de rendimiento. Tanto C ++ como C se utilizan para la programación integrada, sobre el hardware. Si, por ejemplo, escribe un controlador de interrupciones, debe asegurarse de que el código se pueda ejecutar de una vez, sin que se intercambien registros adicionales y / o páginas de memoria. Eso es cuando en línea es útil. Los buenos compiladores se "alinean" ellos mismos cuando se necesita velocidad, pero "en línea" los obliga.
fuente
Se metió en el mismo problema con la incorporación de funciones en las bibliotecas. Parece que las funciones en línea no se compilan en la biblioteca. como resultado, el vinculador genera un error de "referencia indefinida", si un ejecutable quiere usar la función en línea de la biblioteca. (me pasó compilando fuente Qt con gcc 4.5.
fuente
¿Por qué no hacer que todas las funciones estén en línea por defecto? Porque es una compensación de ingeniería. Existen al menos dos tipos de "optimización": acelerar el programa y reducir el tamaño (huella de memoria) del programa. La alineación generalmente acelera las cosas. Elimina la sobrecarga de la llamada de función, evitando empujar y luego sacar parámetros de la pila. Sin embargo, también aumenta la huella de memoria del programa, porque cada llamada a la función ahora debe reemplazarse con el código completo de la función. Para complicar aún más las cosas, recuerde que la CPU almacena fragmentos de memoria usados con frecuencia en un caché en la CPU para un acceso ultrarrápido. Si hace que la imagen de memoria del programa sea lo suficientemente grande, su programa no podrá usar la memoria caché de manera eficiente y, en el peor de los casos, la alineación podría ralentizarlo.
fuente
Nuestro profesor de informática nos instó a nunca usar inline en un programa de c ++. Cuando se le preguntó por qué, nos explicó amablemente que los compiladores modernos deberían detectar cuándo usar en línea automáticamente.
Entonces, sí, el en línea puede ser una técnica de optimización que se utilizará siempre que sea posible, pero aparentemente esto es algo que ya se ha hecho para ti siempre que sea posible incorporar una función de todos modos.
fuente
inline
en C ++ tiene dos significados muy distintos: solo uno de ellos está relacionado con la optimización, y su profesor tiene razón al respecto. Sin embargo, el segundo significado de ainline
menudo es necesario para satisfacer la regla de una definición .Conclusión de otra discusión aquí:
¿Hay algún inconveniente con las funciones en línea?
Aparentemente, no hay nada de malo en usar funciones en línea.
¡Pero vale la pena señalar los siguientes puntos!
El uso excesivo de la línea puede hacer que los programas sean más lentos Dependiendo del tamaño de una función, su alineación puede hacer que el tamaño del código aumente o disminuya. Incluir una función de acceso muy pequeña generalmente disminuirá el tamaño del código, mientras que incluir una función muy grande puede aumentar drásticamente el tamaño del código. En los procesadores modernos, el código más pequeño generalmente se ejecuta más rápido debido a un mejor uso del caché de instrucciones. - Pautas de Google
Los beneficios de velocidad de las funciones en línea tienden a disminuir a medida que la función crece en tamaño. En algún momento, la sobrecarga de la llamada a la función se vuelve pequeña en comparación con la ejecución del cuerpo de la función, y se pierde el beneficio - Fuente
Hay algunas situaciones en las que una función en línea puede no funcionar:
La
__inline
palabra clave hace que una función se inserte solo si especifica la opción de optimización. Si se especifica optimizar, si se cumple o no__inline
depende de la configuración de la opción de optimizador en línea. De manera predeterminada, la opción en línea está vigente siempre que se ejecuta el optimizador. Si especifica optimizar, también debe especificar la opción noinline si desea__inline
que se ignore la palabra clave. -Fuentefuente
inline
palabra clave para determinar si se debe codificar o no todos los puntos mencionados anteriormente son incorrectos. Serían verdaderas si el compilador usara la palabra clave para alinear (solo se usa para determinar el marcado de múltiples definiciones para fines de vinculación).