una todas parametros llamar las funciones funcion estructura ejemplos dev con como codigos c++ inline-functions

todas - funciones en dev c++



¿Beneficios de las funciones en línea en C++? (14)

¿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, las CPU rápidas, la gran memoria, etc. ¿Qué ventajas tienen realmente hoy?


Ventajas

  • Al insertar su código donde se necesita, su programa pasará menos tiempo en la llamada a la función y devolverá las piezas. Se supone que debe hacer que su código vaya más rápido, incluso a medida que crece (ver más abajo). La incorporación de los accesores triviales podría ser un ejemplo de la inclusión efectiva.
  • Al marcarlo como en línea, puede colocar una definición de función en un archivo de encabezado (es decir, se puede incluir en varias unidades de compilación, sin que el vinculador se queje)

Desventajas

  • Puede hacer que su código sea más grande (es decir, si utiliza en línea para funciones no triviales). Como tal, podría provocar paginación y anular las optimizaciones del compilador.
  • Rompe ligeramente su encapsulación porque expone el proceso interno de su objeto (pero, también, cada miembro "privado" también lo haría). Esto significa que no debe usar la alineación en un patrón PImpl.
  • Rompe ligeramente la encapsulación 2: el proceso de inclusión de C ++ se resuelve en el momento de la compilación. Lo que significa que si cambia el código de la función en línea, deberá volver a compilar todo el código que lo usa para asegurarse de que se actualizará (por el mismo motivo, evito los valores predeterminados para los parámetros de la función)
  • Cuando se usa en un encabezado, hace que su archivo de encabezado sea más grande y, por lo tanto, diluirá información interesante (como la lista de métodos de clase) con el código que no le interesa al usuario (esta es la razón por la que declaro las funciones en línea dentro de un clase, pero lo definirá en un encabezado después del cuerpo de la clase, y nunca dentro del cuerpo de la clase).

Magia en línea

  • El compilador puede o no incluir las funciones marcadas como inline; también puede optar por funciones en línea no marcadas como en línea en el momento de la compilación o el enlace.
  • Inline funciona como una copia / pegado controlada por el compilador, que es bastante diferente de una macro preprocesadora: la macro estará en línea forzada, contaminará todos los espacios de nombres y el código, no será fácil de depurar, y se hará incluso Si el compilador lo hubiera descartado como ineficiente.
  • Cada método de una clase definida dentro del cuerpo de la clase en sí se considera como "en línea" (incluso si el compilador todavía puede decidir no en línea)
  • Los métodos virtuales no deben ser inlinables. Aún así, a veces, cuando el compilador puede saber con seguridad el tipo de objeto (es decir, el objeto fue declarado y construido dentro del mismo cuerpo de la función), incluso una función virtual estará en línea porque el compilador sabe exactamente el tipo del objeto.
  • Los métodos / funciones de la plantilla no siempre están en línea (su presencia en un encabezado no los hará automáticamente en línea).
  • El siguiente paso después de "en línea" es la metaprogramación de plantillas. Es decir, al "insertar" su código en tiempo de compilación, a veces, el compilador puede deducir el resultado final de una función ... Entonces, un algoritmo complejo a veces puede reducirse a un tipo de return 42 ; declaración. Esto es para mí extremo en línea . Ocurre raramente en la vida real, hace que el tiempo de compilación sea más largo, no hinche 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 de los procesos no se pueden resolver de esta manera ... Sin embargo, esto es bueno de todos modos
    :-pag

¿Por qué no hacer todas las funciones en línea por defecto? Porque es un intercambio de ingeniería. Hay al menos dos tipos de "optimización": acelerar el programa y reducir el tamaño (huella de memoria) del programa. Alinear generalmente acelera las cosas. Se deshace de la función de sobrecarga de llamada, evitando empujar y luego extraer parámetros de la pila. Sin embargo, también hace que la huella de memoria del programa sea más grande, porque cada llamada de 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 trozos de memoria de uso frecuente en una memoria caché en la CPU para un acceso ultrarrápido. Si hace que la imagen de la memoria del programa sea lo suficientemente grande, su programa no podrá utilizar la memoria caché de manera eficiente, y en el peor de los casos, la inclusión en línea podría ralentizar su programa. Hasta cierto punto, el compilador puede calcular cuáles son las compensaciones y puede tomar mejores decisiones que usted, solo mirando el código fuente.


Cayó en el mismo problema con la incorporación de funciones en las bibliotecas. Parece que las funciones en línea no están compiladas en la biblioteca. como resultado, el enlazador emite un error de "referencia indefinida", si un ejecutable desea usar la función integrada de la biblioteca. (Me pasó compilando fuente Qt con gcc 4.5.


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 inline puede hacer programas más lentos. Dependiendo del tamaño de una función, al insertarlo puede aumentar o disminuir el tamaño del código. La incorporación de una función de acceso muy pequeña generalmente disminuirá el tamaño del código, mientras que la incorporación de una función muy grande puede aumentar considerablemente 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 de la memoria caché de instrucciones. - Directrices de Google

  • Los beneficios de velocidad de las funciones en línea tienden a disminuir a medida que la función aumenta de tamaño. En algún punto, 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 el beneficio se pierde - Fuente

  • Hay pocas situaciones en las que una función en línea puede no funcionar:

    • Para una función que devuelve valores; si existe una declaración de devolución.
    • Para una función que no devuelve ningún valor; si existe un bucle, switch o goto.
    • Si una función es recursiva. -Fuente
  • La palabra clave __inline hace que una función esté en línea solo si especifica la opción de optimización. Si se especifica la optimización, si o no se __inline depende de la configuración de la opción de optimizador en línea. De forma predeterminada, la opción en línea está en vigencia cada vez que se ejecuta el optimizador. Si especifica optimizar, también debe especificar la opción noinline si desea que la palabra clave __inline sea ​​ignorada. -Source


Durante la optimización, muchos compiladores incorporará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.


En arcaico C y C ++, inline es como un register : una sugerencia (nada más que una sugerencia) para el compilador sobre una posible optimización.

En C ++ moderno, inline le dice al vinculador que, si se encuentran múltiples definiciones (no declaraciones) en diferentes unidades de traducción, todas son iguales, y el vinculador puede mantener una y liberar libremente todas las demás.

inline es obligatoria si una función (sin importar cuán compleja o "lineal") se defina en un archivo de encabezado, para permitir que múltiples fuentes la incluyan sin que el vinculador genere un error de "definición múltiple".

Las funciones miembro definidas dentro de una clase están "en línea" por defecto, al igual que las funciones de plantilla (en contraste con las funciones globales).

//fileA.h inline void afunc() { std::cout << "this is afunc" << std::endl; } //file1.cpp #include "fileA.h" void acall() { afunc(); } //main.cpp #include "fileA.h" void acall(); int main() { afunc(); acall(); } //output this is afunc this is afunc

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 no se especifica ninguna inline , el enlazador se quejará.


En términos generales, estos días con cualquier compilador moderno preocupado por alinear cualquier cosa es casi 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 te importa la velocidad, dile al compilador que optimice la velocidad. Si te importa el espacio, dile al compilador que optimice el espacio. Como se alude a otra respuesta, un compilador decente incluso se integrará automáticamente si realmente tiene sentido.

Además, como han dicho otros, el uso de inline no garantiza en línea de nada. Si desea garantizarlo, tendrá que definir una macro en lugar de una función en línea para hacerlo.

¿Cuándo alinear y / o definir una macro para forzar la inclusión? - Solo cuando tenga un aumento demostrado y necesario en la velocidad para una sección crítica de código que se sabe que afecta el rendimiento general de la aplicación.


Inlining es una sugerencia para el compilador que puede ignorar. Es ideal para pequeños trozos 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 posible aumento de tamaño binario pero, mientras las funciones sean pequeñas, esto no importará demasiado.

Tiendo a dejar este tipo de decisiones a los compiladores hoy en día (bueno, los inteligentes de todos modos). Las personas que los escribieron tienden a tener un conocimiento mucho más detallado de las arquitecturas subyacentes.


La función en línea es la técnica de optimización utilizada por los compiladores. Uno puede simplemente añadir una palabra clave en línea para que funcione prototipo para hacer una función en línea. La función en línea le indica al compilador que inserte el cuerpo completo de la función en cualquier lugar donde esa función se haya utilizado en el código.

Ventajas: -

  1. No requiere función de sobrecarga de llamadas.

  2. También ahorra gastos generales de las variables push / pop en la pila, mientras que la función llama.

  3. También ahorra gastos generales de devolución de llamada de una función.

  4. Aumenta la localidad de referencia mediante el uso de la memoria caché de instrucciones.

  5. Después de incorporar el compilador, también se puede aplicar la optimización intra-procedimiento si se especifica. Este es el más importante, de esta manera el compilador ahora puede centrarse en la eliminación de código muerto, puede hacer más hincapié en la predicción de rama, eliminación de variables de inducción, etc.

Para saber más sobre esto, puede seguir este enlace http://tajendrasengar.blogspot.com/2010/03/what-is-inline-function-in-cc.html


Las funciones en línea son más rápidas porque no es necesario empujar y sacar cosas de la pila como si fueran parámetros y la dirección de retorno; sin embargo, hace que tu binario sea un poco más grande.

¿Hace una diferencia significativa? No notablemente suficiente en el hardware moderno para la mayoría. Pero puede hacer una diferencia, lo cual es suficiente para algunas personas.

Marcar algo en línea no le da una garantía de que estará en línea. Es solo una sugerencia para el compilador. A veces no es posible, por ejemplo, cuando tiene una función virtual o cuando se trata de una recursión. Y a veces el compilador simplemente elige no usarlo.

Pude ver una situación como esta haciendo una diferencia detectable:

inline int aplusb_pow2(int a, int b) { return (a + b)*(a + b) ; } for(int a = 0; a < 900000; ++a) for(int b = 0; b < 900000; ++b) aplusb_pow2(a, b);


Me gustaría agregar que las funciones en línea son cruciales cuando estás creando 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 archivos binarios de la biblioteca ni a la tabla de símbolos.

Puede ser crítico cuando la biblioteca está diseñada para ser cargada en tiempo de ejecución. También puede golpear bibliotecas compatibles con binarios. En tales casos, no utilice en línea.


No se trata del rendimiento. Tanto C ++ como C se utilizan para la programación incrustada, colocados sobre el hardware. Si, por ejemplo, escribiera un controlador de interrupciones, debe asegurarse de que el código pueda ejecutarse a la vez, sin que se intercambien registros adicionales o páginas de memoria. Es entonces cuando el inline es útil. Los buenos compiladores se "incorporan" cuando necesitan velocidad, pero "en línea" los obliga.


Nuestro profesor de ciencias de la computación nos instó a nunca utilizar inline en un programa c ++. Cuando se le preguntó por qué, explicó amablemente que los compiladores modernos deberían detectar cuándo usar en línea automáticamente.

Entonces, sí, la 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 usted siempre que sea posible integrar una función de todos modos.


inline permite colocar una definición de función en un archivo de encabezado y #include ese archivo de encabezado en múltiples archivos de origen sin violar la regla de una definición.