Pregunta

Aunque sería muy conveniente el uso de las funciones inline en algunas situaciones,

¿Hay alguna desventaja con funciones en línea?

Conclusión:

Al parecer, no Hay nada malo con el uso de las funciones inline.

Pero vale la pena destacar los siguientes puntos!

  • El uso excesivo de alineaciones en realidad puede hacer que los programas más lento.Según una función del tamaño, inline puede hacer que el tamaño del código para aumentar o disminuir.Inline una pequeña función de descriptor de acceso usualmente se reduce el tamaño del código, mientras inline una gran función puede aumentar drásticamente el tamaño del código.En los procesadores modernos más pequeño código, por lo general se ejecuta más rápido debido a un mejor uso de la caché de instrucciones. - Directrices De Google

  • Las ventajas de velocidad de funciones en línea tienden a disminuir a medida que la función crece en tamaño.En algún punto de la sobrecarga de la llamada a la función se hace pequeño en comparación con la ejecución de la función del cuerpo, y el beneficio se pierde - Fuente

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

    • Para que una función devuelva valores;si una instrucción return existe.
    • Para que una función no devuelve ningún valor;si un bucle, cambiar o instrucción goto existe.
    • Si una función es recursiva. -Fuente
  • El __inline palabras clave causas de una función a estar en línea sólo si se especifica la opción optimize.Si a optimizar se especifica, si o no __inline es un honor depende de la configuración de la línea de la optimizador de opción.De forma predeterminada, la opción en línea es, en efecto, siempre que el optimizador se ejecuta.Si especifica optimizar , también debe especificar el noinline opción si desea que el __inline la palabra clave para ser ignorado. -Fuente

¿Fue útil?

Solución

Vale la pena señalar que la palabra clave inline es en realidad sólo una sugerencia para el compilador.El compilador puede ignorar la línea y simplemente generar código para la función en algún lugar.

El principal inconveniente para las funciones en línea es que se puede aumentar el tamaño de su archivo ejecutable (dependiendo del número de casos).Esto puede ser un problema en algunas plataformas (por ejemplo.sistemas embebidos), especialmente si la función es recursiva.

También me gustaría recomendar hacer en línea había funciones muy pequeño - Las ventajas de velocidad de funciones en línea tienden a disminuir a medida que la función crece en tamaño.En algún punto de la sobrecarga de la llamada a la función se hace pequeño en comparación con la ejecución de la función del cuerpo, y el beneficio se pierde.

Otros consejos

Se podría aumentar el tamaño de la ejecutable, y no creo que los compiladores siempre va a hacer realidad ellos en línea, incluso a pesar de que se utiliza el palabra clave inline.(O es la otra camino alrededor, como lo Vaibhav dijo?...)

Creo que está bien si el la función tiene sólo 1 o 2 declaraciones.

Editar: Aquí está lo que el linux CodingStyle el documento dice al respecto:

Capítulo 15:La línea de la enfermedad

No parece ser un común la percepción errónea de que gcc tiene una magia "me hacen más rápido" speedup opción que se llama "en línea".Mientras que el uso de elementos incorporados puede ser apropiada (por ejemplo, como un medio de la sustitución de macros, vea el Capítulo 12), muy a menudo no lo es.El uso abundante de la palabra clave inline conduce a una más grande del núcleo, que a su vez disminuye la sistema como un todo hacia abajo, debido a un más grande icache huella de la CPU y simplemente porque hay menos la memoria disponible para el pagecache.Sólo pensar en ello;un pagecache miss hace una búsqueda en disco, que fácilmente se 5 milisegundos.Hay un MONTÓN de cpu ciclos que pueden entrar en estos 5 milisegundos.

Una razonable regla de oro es no poner en línea en las funciones que tienen más de 3 líneas de código en ellos.Un la excepción a esta regla son los casos cuando un parámetro es conocido por ser un en tiempo de compilación constante, y como resultado de esta constantness usted saber el compilador será capaz de optimizar la mayoría de los de su función de distancia en tiempo de compilación.Para un buen ejemplo de este último caso, ver el kmalloc() función en línea.

A menudo las personas argumentan que la adición en línea a las funciones que son estáticas y se utiliza sólo una vez que es siempre una victoria desde allí hay espacio de trueque.Mientras que esto es técnicamente correcto, gcc es capaz de inline estos automáticamente sin ayuda, y la cuestión del mantenimiento de la eliminación de la línea cuando un segundo usuario aparece mayor que el valor potencial de la sugerencia que se indica a gcc para hacer algo habría hecho de todos modos.

Estoy de acuerdo con los otros posts:

  • en línea puede ser superfluo, porque el compilador va a hacer
  • en línea puede inflar su código

Un tercer punto es se le puede obligar a exponer los detalles de la implementación en sus encabezados .e.g.,

class OtherObject;

class Object {
public:
    void someFunc(OtherObject& otherObj) {
        otherObj.doIt(); // Yikes requires OtherObj declaration!
    }
};

Sin la línea hacia adelante y a la declaración de OtherObject era todo lo que necesitaba.Con la línea de su encabezado de las necesidades de la definición de OtherObject.

Como otros han mencionado, la palabra clave inline es sólo una sugerencia para el compilador.En realidad, la mayoría de los compiladores modernos, se ignoran por completo esta sugerencia.El compilador tiene su propia heurística para decidir si en línea de una función, y, francamente, no quiero tu consejo, muchas gracias.

Si usted realmente quiere hacer algo en línea, si usted realmente ha perfilado y miró el desmontaje, para garantizar que reemplazar el compilador heurística en realidad tiene sentido, entonces es posible:

  • En VC++, el uso de la __forceinline palabra clave
  • En el GCC, el uso de __attribute__((always_inline))

La palabra clave inline tiene un segundo, válida propósito sin embargo - declarar funciones en archivos de encabezado, pero no dentro de una definición de clase.La palabra clave inline es necesario para indicarle al compilador no para generar múltiples definiciones de la función.

Hay un problema con la línea una vez que haya definido una función en un archivo de encabezado (lo que implica en línea, ya sea explícita o implícita, mediante la definición de un cuerpo de un miembro de la función dentro de la clase) no es fácil cambiar sin obligar a los usuarios a volver a compilar (en contraposición a volver a vincular).A menudo esto causa problemas, especialmente si la función en cuestión se define en una biblioteca y el encabezado es la parte de su interfaz.

Yo lo dudo.Incluso el compilador automáticamente inline algunas de las funciones para la optimización.

No sé si mi respuesta relacionada con la pregunta, pero:

Ser muy cuidado acerca de en línea a los métodos virtuales!Algunos buggy compiladores (las versiones anteriores de Visual C++ por ejemplo) podría generar código en línea por métodos virtuales donde el comportamiento estándar fue no hacer nada, sino de ir abajo en el árbol de herencia, y llamar al método apropiado.

Inline funciones más grandes pueden hacer que el programa más grande, lo que resulta en más errores de caché y lo que es más lento.

Decidir cuándo una función es lo suficientemente pequeño que inline aumentará el rendimiento es bastante complicado. Google C++ Guía de Estilo se recomienda únicamente funciones inline de 10 líneas o menos.

También debe tener en cuenta que la palabra clave inline es sólo una solicitud.El compilador puede decidir no en línea es, asimismo, el compilador puede elegir para hacer una función en línea que usted no se definen como en línea si se piensa que la velocidad y el tamaño de desventaja es la pena.

Esta decisión es en general hizo sobre la base de un número de cosas, tales como el ajuste entre optimizar para velocidad(evita la llamada a la función) y optimizar el tamaño (inline puede hacer que el código hinchazón, así que no es ideal para grandes repetidamente las funciones de uso).

con el VC++ compilador puede dominen esta decisión mediante el uso de __forceinline

ASÍ, en general:Uso en línea si usted realmente desea tener una función en un encabezado, pero en otros lugares hay poco punto, porque si tu vas a obtener nada de ella, un buen compilador va a ser lo que es en línea para usted de todos modos.

Exceso de alineaciones de las funciones puede aumentar el tamaño del ejecutable compilado que puede tener un impacto negativo en el rendimiento de la caché, pero a día de hoy compilador de decidir acerca de la función inline en su propia (en función de muchos criterios) e ignorar la palabra clave inline.

Entre otros temas, con funciones en línea, que la he visto muy saturada (he visto las funciones en línea de 500 líneas), lo que tienes que tener en cuenta son:

  • generar inestabilidad

    • Cambio de la fuente de una función en línea hace que todos los usuarios de la cabecera para volver a compilar
    • #includes escape hacia el cliente.Esto puede ser muy desagradable si de renovación de una línea de la función y quitar una que ya no se utilizan de cabecera que algún cliente ha invocado.
  • el tamaño del ejecutable

    • Cada vez que una línea está alineada en lugar de una instrucción de llamada el compilador tiene que generar todo el código de la línea.Esto está bien si el código de la función es breve (una o dos líneas), no es tan bueno, si la función es largo
    • Algunas funciones pueden producir mucho más código que aparece por primera vez.Me caso en cuestión es un 'trivial' destructor de una clase que tiene un montón de no-pod variables miembro (o dos o 3 miembros de variables con bastante desordenado destructores).Una llamada tiene que ser generado por cada destructor.
  • el tiempo de ejecución

    • esto es muy dependiente de su caché de CPU y bibliotecas compartidas, pero localidad de referencia es importante.Si el código que puede ser inline pasa a ser celebrada en caché de cpu en un solo lugar, un número de clientes que puede encontrar el código de un no sufren de un error de caché y la memoria posterior fetch (y peor, en caso de suceder, un disco de recuperación).Lamentablemente este es uno de esos casos donde realmente se necesita para hacer análisis de rendimiento.

El estándar de codificación de donde yo trabajo límite de funciones en línea a simple incubadoras/getters, y específicamente dicen que los destructores no debe ser en línea, a menos que tenga las medidas de rendimiento para mostrar el inline confiere una notable ventaja.

  1. Como otra gente dice que la función en línea puede crear un problema si el código es grande.Como cada instrucción se almacena en una ubicación de memoria específica ,por lo que la sobrecarga de funciones en hacer un código de tomar más tiempo para obtener exicuted.

  2. hay algunas situaciones donde en línea pueden no funcionar

    1. no funciona en caso de función recursiva.
    2. También puede que no funcione con la variable estática.
    3. también que no funcione en caso de uso de un bucle,switch, etc.o podemos decir que con varias instrucciones.
    4. Y la función principal no puede trabajar como función inline.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top