Cuando el uso de función en línea y cuando no se usa?

Sé que en línea es una sugerencia o petición para el compilador y se usa para evitar la llamada a la función de los gastos generales.

Así, ¿sobre qué base se puede determinar si una función es un candidato para inline o no ?
En el que caso de que uno debe evitar inline ?

  • inline es el C++ recién llegado lo CFLAGS son los de Gentoo recién llegado: no, compilar con -O3 -funroll-loops -finline-functions no hará que tu viejo Pentium volar 😉
  • Una razón para no usar en línea es que algunos depuradores no permiten establecer un punto de interrupción o de paso en una línea de la función.
  • Duplicado: stackoverflow.com/questions/1875947/…
  • Usted no debería determinar si una función debe estar en línea o no. Dejar que el compilador de hacer, es mejor que usted (y puede funciones en línea de forma selectiva según el entorno de cada llamada).
InformationsquelleAutor Ashish | 2009-12-19

14 Kommentare

  1. 195

    Evitar el costo de una llamada de función es sólo la mitad de la historia.

    hacer:

    • uso inline en lugar de #define
    • muy pequeño funciones son buenos candidatos para inline: código más rápido y más pequeño de los ejecutables (más posibilidades de permanecer en la caché de código)
    • la función es pequeño y llamado muy a menudo

    no:

    • grandes funciones: conduce a grandes ejecutables, lo que perjudica notablemente el rendimiento, independientemente de la ejecución más rápida que los resultados de la llamada sobrecarga
    • funciones en línea que son de I/O bound
    • la función se utiliza raramente en la
    • constructores y destructores: incluso cuando está vacío, el compilador genera código para ellos
    • romper la compatibilidad binaria cuando el desarrollo de las bibliotecas:
      • en línea de una función existente
      • cambio de una función en línea o hacer una función inline no en línea: antes de la versión de la biblioteca de llamar a la implementación viejo

    cuando el desarrollo de una biblioteca, con el fin de hacer una clase extensible en el futuro, usted debe:

    • no añadir en línea destructor virtual incluso si el cuerpo está vacío
    • hacer todos los constructores no en línea
    • escribir no en línea implementaciones de el constructor de copia y el operador de asignación, a menos que la clase no puede ser copiado por valor

    Recordar que el inline palabra clave es una sugerencia para que el compilador el compilador puede decidir no en línea de una función y puede decidir funciones en línea que no fueron marcados inline en el primer lugar. Yo en general, evitar el marcado de la función inline (excepto tal vez cuando se escribe muy, muy pequeña de funciones).

    Sobre el rendimiento, la sabiduría, es (como siempre) para un perfil de la aplicación, a continuación, finalmente inline un conjunto de funciones que representan un cuello de botella.

    Referencias:


    EDICIÓN: Bjarne Stroustrup, El Lenguaje de Programación C++:

    Una función puede ser definida a ser inline. Por ejemplo:

    inline int fac(int n)
    {
      return (n < 2) ? 1 : n * fac(n-1);
    }

    La inline especificador es una sugerencia para que el compilador que debe intentar generar código para una llamada de fac() en línea en lugar de por el que se establecen el código de la función una vez y, a continuación, llamar a través de la llamada a función mecanismo. Una inteligente compilador puede generar la constante 720 para una llamada fac(6). La posibilidad de que mutuamente recursivas funciones en línea, en línea funciones que recurse o no dependiendo de la entrada, etc., hace que sea imposible garantizar que todas las llamadas de un inline función es en realidad entre líneas. El grado de inteligencia de un compilador no puede ser legislado, por lo que un compilador puede generar 720, otro 6 * fac(5), y otro de naciones unidas-en línea llamada fac(6).

    Para hacer alineaciones posibles en ausencia de astuta compilación y vinculación de las instalaciones, la definición–y no sólo la declaración de una función en línea debe ser en el ámbito de aplicación (artículo 9.2). Un inline especifier no afecta a la semántica de una función. En particular, una función en línea todavía tiene una dirección única, y así ha static variables (§7.1.2) de una función en línea.

    EDIT2: ISO-IEC 14882-1998, 7.1.2 Función de los especificadores de

    Una declaración de función (8.3.5, 9.3, 11.4) con un inline especificador declara una función inline. El especificador en línea le indica a la aplicación que en línea de sustitución de la función del cuerpo en el punto de llamada es preferible a la habitual llamada a la función de mecanismo. Una aplicación no es necesario para realizar este inline sustitución en el punto de llamada; sin embargo, incluso si esta en línea sustitución se omite, el resto de reglas para funciones en línea definido por 7.1.2 deberá ser respetado.

    • inline es mucho más que una ayuda para el compilador. Cambia las reglas del lenguaje acerca de las múltiples definiciones. Asimismo, el contar con datos estáticos no es una fundición de hierro razón para evitar una función inline. La aplicación está obligado a asignar un solo objeto estático para cada función estática o no, si la función se declara inline o no. Las clases son todavía extensible si tienen en línea constructores y destructores virtuales. Y vacía llave destructor es una función virtual que es a veces una buena idea dejar en línea.
    • Es una sugerencia en el sentido de que la función no necesariamente termina entre líneas (pero el inglés no es mi lengua materna). Acerca de la estática en las funciones marcadas inline, el resultado es que la función no recibe entre líneas: usted paga el precio de la llamada y también cada unidad de traducción que incluye y llama a la función que obtiene su propia copia del código y variables estáticas. La razón por la que no inline constructores y destructores, cuando el desarrollo de una biblioteca es la compatibilidad binaria con las futuras versiones de su biblioteca
    • Funciones con la estática puede estar en línea, sólo las acciones sobre el objeto estático que debe referirse a la misma ‘global’ objeto; es requerida por la norma. W. r.t. la compatibilidad binaria estoy de acuerdo con sus razones, pero es otro cuento. El hecho de que los nuevos miembros de datos privados romper la compatibilidad binaria por lo general pone otras preocupaciones en la sombra. Para la larga duración de la compatibilidad binaria que a menudo terminan tener que «pimpl» objetos más interesantes de todos modos, representación de la línea de la discusión irrelevante.
    • He editado la respuesta. Yo tenía en mente edad de los compiladores para el tratamiento de la onu-entre líneas la función como si hubiera sido declarado static. De hecho, conforme los compiladores de hacer las cosas bien, pero era un «mejor prevenir que curar» enfoque. El problema puede surgir cuando uno abusa de static en una función de manera que se convierte en privado en vez de ponerlo en un espacio de nombres anónimos. Acerca de pimpl, estuvo de acuerdo.
    • Es inexacto llamar una «sugerencia para el compilador». En realidad, noinline funciones pueden estar en línea si el compilador se siente como él. Y inline funciones no estar en línea si el compilador decide no en línea de ellos. Como Charles Bailey dijo, cambia las reglas del lenguaje. En lugar de pensar en él como una sugerencia de optimización, es más exacto pensar que es un concepto completamente diferente. El inline palabra clave indica al compilador que permiten múltiples definiciones, y nada más. El «inline» optimización se puede aplicar a casi cualquier función, si es o no es marcada inline.
    • No veo cómo, por qué mi descriptivo de la respuesta se resume como «pensar en él como una sugerencia de optimización» y yo puede ser ciego, pero lo que estás diciendo en tu comentario acerca de que el compilador está a cargo de decidir qué se hace en línea y lo que no, lo escribí al final de mi respuesta. Y como por thefreedictionary.com/hint un «consejo» significa «una ligera indicación»
    • Sí, pero el punto es que no es «una ligera indicación», sino una manera de conseguir que el código compilar y vincular con éxito, donde de lo contrario podría resultar en un error. Ese es el propósito de la inline palabra clave.
    • Es sólo que, cuando Stroustrup escribe «el especificador en línea es una sugerencia para que el compilador», estoy sorprendido de que yo soy culpado por citar a él. De todos modos, he pasado bastante tiempo haciendo mi mejor esfuerzo para respaldar esta respuesta con la mayor cantidad posible de referencias
    • Pakosz , ¿por qué debemos evitar inline un I/O limitada función, quiero decir, la CPU todavía tiene que ejecutar los I/O acotado a los códigos, y por cierto, si el tamaño del código de la ampliación no se considera, inline no eliminar la función de la sobrecarga de la llamada.
    • código de datos, si es dependiente de e/S, inline no la velocidad para no pagar el caché de código basura impuesto
    • Pero no podemos utilizar inline con el fin de obtener la función inline. A veces queremos que los otros beneficios, como moverse en la ODR.
    • Sir, ¿a qué te refieres al decir que «Evitar el costo de una llamada de función es sólo la mitad de la historia.» ? Favor de explicar lo más claramente. estás diciendo sobre optimizaciones?

  2. 56

    inline tiene muy poco que ver con la optimización. inline es una instrucción para que el compilador no producir un error si la función dada definición se produce varias veces en el programa y una promesa de que en la definición se producen en cada traducción que se utiliza y en todas partes parece que va a tener exactamente la misma definición.

    Dado las reglas anteriores, inline es adecuado para el corto funciones cuyo cuerpo no necesita, incluyendo extra dependencias sobre lo que acaba de declaración de necesidad. Cada vez que la definición se encontró que deben ser analizados y el código de su cuerpo puede ser generada, lo que implica algún compilador de sobrecarga a través de una función definida por una sola vez en un único archivo fuente.

    Un compilador puede en línea (es decir, sustituir una llamada a la función con el código que realiza la acción de esa función) cualquier llamada a la función que se elige. En el caso de que «obviamente» no podía en línea de una función a la que no fue declarado en la misma unidad de traducción, como la llamada, pero con el creciente uso de enlace de optimización del tiempo, incluso esto no es cierto ahora. Igualmente cierto es el hecho de que las funciones marcadas inline puede no estar en línea.

    • Tengo la sensación de que esto es más que una feliz coincidencia que una intencional característica de C++. La idea es muy similar a la «estática» de las variables globales de C. Es una respuesta muy interesante a pesar de que. Deseo que sólo había utilizado una palabra clave como «interna» para indicar la vinculación interna.
    • +1. @Rehno: no estoy muy seguro de lo que estás diciendo. ¿Qué vinculación tiene que ver con la inline palabra clave? Y lo que es una feliz coincidencia?
    • La lectura de mi comentario, en retrospectiva, me doy cuenta de que es muy vaga y no es que bien pensado. La definición de la misma función en varios archivos de resultados de un error del vinculador que puede ser contrarrestado mediante la declaración de la función ‘estático’. Sin embargo, ‘inline’ le permite hacer lo mismo con sutiles diferencias, que en realidad no se consigue vinculación interna como ‘estática’ hace. Sospecho que esta es en realidad más que una coincidencia, dado que el idioma de los implementadores/diseñadores se dieron cuenta de que se necesita para hacer algo especial con las funciones declaradas en los archivos de cabecera y que han llevado a ‘en línea’.
    • No sé por qué tu comentario tiene tantos votos, ya que el rendimiento es la principal razón para utilizar en línea.
  3. 10

    Decirle al compilador en línea de una función es una optimización, y la regla más importante de la optimización es que la optimización es la raíz de todos los males. Escribir siempre claro código (usando algoritmos eficientes), entonces el perfil de su programa y sólo optimizar las funciones que están tomando demasiado tiempo.

    Si usted encuentra una función en particular es muy corto y sencillo, y está llamado a decenas de miles de veces en un apretado bucle interno, podría ser un buen candidato.

    Usted puede ser sorprendido, a pesar de que muchos compiladores de C++ automáticamente en línea pequeñas funciones para usted – y se podría pasar por alto su solicitud en línea, también.

    • De hecho, tengo mis sospechas de que ciertos compiladores muy sneakily ignorar ‘inline’ completamente y sólo responder a ‘__inline’ o ‘__fuerza_inline’. Supongo que esto es para disuadir el abuso!
    • No suele ser el caso. en línea es sólo una sugerencia, pero es una sugerencia de la mayoría de los compiladores de tomar en serio. Puede configurar el compilador para emitir el lenguaje ensamblador, junto con el código objeto (/FAcs en Visual Studio, -s en GCC) para ver exactamente lo que hace. En mi experiencia, tanto de los compiladores de sopesar la palabra clave inline bastante fuerte.
    • Es interesante, porque en mi experiencia ni g++ ni VC pesar inline palabra clave en todo. Es decir, si la función está en línea, y quitar inline especificador de él, él todavía va a obtener en línea. Si usted tiene alguna ejemplos específicos de lo contrario, por favor, compartir!
    • Me refería al caso opuesto más: el compilador es gratuito en línea nada que le gusta, pero es raro que veo es elegir no a en línea algo de lo que me dijeron a inline. El caso típico que uso aquí es obtener/establecer funciones (que yo en línea en el .h más que definir en una .cpp), y el vector 3d de operaciones. Por alguna razón, funciona como punto/de la cruz del producto, orthonormalization, etc parecen ser justo en el umbral donde MSVC no en línea en su propio, pero respeto la inline palabra clave.
    • Podría estar equivocado, estoy seguro. Creo que una vez vi ‘#define inline’ en uno de los estándar de archivos de encabezado, pero pudo haber sido algunos de compatibilidad con versiones anteriores de la bandera de C. También es cierto que el compilador puede inline cualquier función que desee.
    • ¿cómo funciona el inline palabra clave obstaculizar clara «código»? La palabra clave en «prematuro optimización» es prematuro, no optimización. Decir que se debe activamente *evite optimizaciones es solo basura. El punto de esta cita es que usted debe evitar las optimizaciones que puede no ser necesario, y tener efectos secundarios perjudiciales en el código (como lo que es menos fácil de mantener). No puedo ver cómo la inline palabra clave va a hacer que el código sea más fácil de mantener, o cómo puede ser perjudicial para agregar a una función.
    • jalf, a veces una función inline va a hacer que tu código sea más lento, no más rápido. Un ejemplo es cuando se llama a la función desde varios lugares diferentes en el código; si la función no está en línea, entonces podría estar todavía en la caché de instrucciones cuando se llama desde un lugar diferente, y la rama predictor podría ya ser calentado. Hay algunos patrones que siempre mejorar la eficiencia, por lo que nunca está de más uso de ellos. Inline no es uno de ellos. Generalmente no tiene efecto sobre el rendimiento en todos, a veces ayuda, y a veces duele. Estoy de pie detrás de mi consejo: perfil de primero, luego en línea.
    • Inline a veces es negativo, pero también puede ser un inmenso ganancia de rendimiento bajo las circunstancias adecuadas. He medido es: assemblyrequired.crashworks.org/2009/01/19/…

  4. 5

    La mejor manera de averiguarlo es el perfil de su programa y de la marca de pequeñas funciones que se llama un montón de veces y grabar a través de ciclos de CPU que como inline. La palabra clave aquí es «pequeña» – una vez que la función de la sobrecarga de la llamada es insignificante en comparación con el tiempo de permanencia en la función, es inútil en línea de ellos.

    El otro uso que me gustaría sugerir es que si tienes pequeñas funciones que se llama en el rendimiento de código crítico con la frecuencia suficiente para hacer un cache miss pertinentes, probablemente se deben en línea y los. De nuevo, es algo que el analizador debe ser capaz de decirle.

  5. 4

    Optimización prematura es la raíz de todos los males!

    Como una regla de oro que generalmente en línea sólo «getters» y «incubadoras». Una vez que el código funciona y es estable, perfilado puede demostrar que las funciones se podrían beneficiar de inline.

    Por otro lado, la mayoría de los compiladores modernos tienen muy buena algoritmos de optimización, y va en línea de lo que usted debe tener en línea para usted.

    Reasuming — escribir inline one-liner funciones, y preocuparse por los demás más tarde.

  6. 2

    Funciones en línea podría mejorar su rendimiento del código mediante la eliminación de la necesidad de empujar a los argumentos en la pila.
    si la función en cuestión es una parte crítica de su código que debe tomar la línea no inline decisión en la optimización de parte de su proyecto,

    usted puede leer más acerca de los elementos incorporados en el c++ faq

  7. 1

    Utilizo a menudo funciones en línea no como una optimización, pero para hacer el código más legible. A veces el propio código es más corto y más fácil de entender que los comentarios, nombres descriptivos etc. Por ejemplo:

    void IncreaseCount() { freeInstancesCnt++; }

    El lector inmediatamente sabe el completar la semántica del código.

  8. 0

    Yo por lo general siguen un pulgar regla donde puedo hacer una función con 3-4 declaraciones simples como en línea. Pero es bueno recordar que es solo una sugerencia para el compilador. La llamada final a hacerlo en línea o no es tomada por el compilador sólo. Si hay más de muchas de estas declaraciones no voy a declarar en línea como con una estúpida compilador puede conducir a código de la hinchazón.

  9. 0

    La mejor forma sería la de examinar y comparar los generados instrucciones para la línea y no en línea. Sin embargo, siempre es seguro para omitir inline. El uso de inline podría conducir a problemas que no quieren.

  10. 0

    La hora de decidir si utilizar en línea, por lo general mantienen la siguiente idea en la mente: En las modernas máquinas de la latencia de la memoria puede ser un cuello de botella más grande de crudo cálculos. Funciones inline que se denominan a menudo se conoce a crecer el tamaño del ejecutable. Además, esta función podría ser almacenados en la CPU del código de caché que se reducirá el número de errores de caché cuando que el código debe ser consultado.

    Por lo tanto, usted tiene que decidir por ti mismo: ¿inline aumentar o disminuir el tamaño de la que genera el código máquina? ¿Cómo de probable es que la llamada a la función causará un error de caché? Si está salpicada de todo el código, entonces yo diría que la probabilidad es alta. Si se limita a un solo bucle estrecho, a continuación, la probabilidad es de esperar que bajo.

    Yo normalmente uso inline en los casos I lista de abajo. Sin embargo, cuando usted está genuinamente preocupado por el rendimiento, perfiles es esencial. Además, es posible que desee comprobar si el compilador toma la pista.

    • Corto rutinas que son llamados en un bucle ajustado.
    • Muy básico descriptores de acceso (get /set) y funciones de contenedor.
    • Código de la plantilla en los archivos de encabezado por desgracia obtener automáticamente la línea de la pista.
    • Código corto que se utiliza como una macro. (E. g. min() /max())
    • Corto rutinas matemáticas.
  11. 0

    También, en una línea de método tiene efectos secundarios graves, cuando el mantenimiento de grandes proyectos. Cuando la línea de código se cambia, todos los archivos que uso será reconstruir automáticamente por el compilador (es un buen compilador). Esto podría perder mucho de su tiempo de desarrollo.

    Cuando un inline método se transfiere a un archivo de origen y no entre líneas más, todo el proyecto debe ser reconstruido (al menos esta ha sido mi experiencia). Y también cuando los métodos se convierten en la línea.

    • Esa es una cuestión diferente. Usted consigue la reconstrucción problema para el código que se coloca en un archivo de encabezado. Si está marcada inline o no no importa (otros que sin el inline palabra clave, obtendrá errores del vinculador – pero el inline palabra clave no es el problema que causa el exceso de reactiva.
    • Sin embargo, el cambio de una línea de método puede provocar exceso construye frente a cambio de un no-inline método en un shource archivo.
  12. 0

    Se debe utilizar el en línea función calificador sólo cuando el código de la función es pequeño.Si las funciones son las de mayor tamaño se debe preferir las funciones normales ya que el ahorro en el espacio de la memoria es la pena el comparativamente pequeño sacrificio en la velocidad de ejecución.

  13. 0

    Cuando usted piensa que su código es lo suficientemente pequeño como para ser utilizado como en línea y recordar función en línea duplicar el código y péguelo se se llama a la función por lo que puede ser lo suficientemente bueno como para aumentar su tiempo de ejecución, pero el aumento de consumo de memoria de también.
    Usted no puede utilizar la función en línea cuando usted está utilizando un bucle/variable estática/recursivo/interruptor/goto/función Virtual.
    Virtual significa esperar hasta el tiempo de ejecución y en línea de los medios durante la compilación, por lo que no se pueden utilizar simultáneamente.

  14. -2

    He leído algunas de las respuestas y ver que hay algunas cosas que faltan.

    La regla de uso no es para usar en línea, a menos que quiero es estar en línea. Parece una tontería, ahora la explicación.

    Compiladores son lo suficientemente inteligentes y corto funciones siempre se hace en línea. Y nunca hace mucho tiempo la función como en línea, a menos que el programador dijo que para hacer eso.

    Sé que en línea es una sugerencia o petición compilador

    Realidad inline es una orden para el compilador, no tiene opciones y después inline palabra clave que hace que todo el código en línea. Así que usted puede nunca use inline palabra clave y compilador de diseño más corto de código.

    Así que cuando el uso de inline?

    Para usar si usted quiere tener un poco de código en línea. Sé que sólo un ejemplo, porque yo lo uso sólo en una situación. Es la autenticación de usuario.

    Por ejemplo yo tengo esta función:

    inline bool ValidUser(const std::string& username, const std::string& password)
    {
        //here it is quite long function
    }

    No importa que tan grande esta función es lo quiero tener como inline porque hace que mi software más difíciles de descifrar.

    • en línea es todavía un toque. El compilador puede fallar en línea si considera que su función es demasiado hinchado.
    • Uno dice en línea es una orden… el otro dice que es una sugerencia de alguien corroborar su declaración, por lo que se puede determinar cual es la verdadera?
    • yo apoyo a la instrucción en línea es sólo una sugerencia. Esto ha sido apoyado por muchos sitios web y libros

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea