2009-08-13 12 views
6

Las funciones en línea son solo una solicitud a los compiladores que insertan el cuerpo completo de la función en línea en cada lugar del código donde se usa esa función.Función en línea (cuándo insertar)?

¿Pero cómo el compilador decide si debe insertarlo o no? ¿Qué algoritmo/mecanismo usa para decidir?

Gracias,

Naveen

+1

no es una solicitud - es una recomendación. La decisión depende del compilador – chester89

Respuesta

4

Algunos aspectos comunes:

    opción
  • compilador (versiones de depuración por lo general no en línea, y la mayoría de los compiladores tienen opciones para anular la línea declaración para tratar de alinear todo, o ninguno)
  • convención de llamadas adecuada (por ejemplo, funciones varargs generalmente no están en línea)
  • adecuado para inlining: depende del tamaño de la función, frecuencia de llamada de la función, ganancias a través de la línea, y conjunto de optimización tings (velocidad vs. tamaño del código). A menudo, pequeñas funciones tienen los mayores beneficios, sino una función enorme pueden ser inline si se llama una sola vez
  • configuración
  • profundidad de llamadas en línea y recursividad

El tercero es probablemente el núcleo de su pregunta, pero eso es realmente "Heurística específica del compilador": debe verificar los documentos del compilador, pero generalmente no le darán demasiadas garantías. MSDN tiene cierta información (limitada) para MSVC.

Más allá de las trivialidades (por ejemplo, getters simples y funciones muy primitivas), como ya no es muy útil. El costo de la instrucción de llamadas ha disminuido y la predicción de ramas ha mejorado mucho.

El gran oportunidad para los procesos en línea es la eliminación de las rutas de código que el compilador sabe que no serán tomadas - como un ejemplo extremo:

inline int Foo(bool refresh = false) 
{ 
    if (refresh) 
    { 
     // ...extensive code to update m_foo 
    } 
    return m_foo; 
} 

Un buen compilador inline Foo(false), pero no Foo(true).

Con Enlace Tiempo de generación de código, Foo podría residir en un .cpp (sin declararion inline), y Foo(false) seguiría siendo inline, así que de nuevo en línea tiene sólo efectos marginales aquí.


En resumen: Hay pocos escenarios en los que debería tener el control manual de procesos en línea mediante la colocación (o la omisión) declaraciones en línea.

-2

inserta si se escribe "en línea" al comienzo de la función?

+2

No es necesario. Es solo una solicitud. – Naveen

+0

Para C++, básicamente solo significa que no causa errores de enlazador si los diferentes archivos de objeto contienen la misma definición. Eso es requerido por el estándar.Usar 'inline' o no normalmente no está correlacionado de ninguna manera si la función realmente se inline. – gimpf

+0

al menos los comentarios informan a la gente :) – ufukgun

2

Todo lo que sé sobre las funciones en línea (y muchas otras cosas en C++) es here.

Además, si se está centrando en la heurística de cada compilador para decidir si está o no dentro de una función, eso depende de la implementación y debe consultar la documentación de cada compilador. Tenga en cuenta que la heurística también podría cambiar según el nivel de optimización.

1

Estoy bastante seguro de que la mayoría de los compiladores deciden basándose en la longitud de la función (cuando se compila) en bytes y con qué frecuencia se usa frente al tipo de optimización (velocidad frente a tamaño).

1

sé único criterio par:

  • Si se encuentra con la recursividad en línea - en línea será ignorado.
  • interruptor de encendido/tiempo/en la mayoría de los casos causan compilador de hacer caso omiso de línea
1

Depende del compilador. Aquí es (la primera parte) lo que el manual del CCG dice:

 
    -finline-limit=n 
      By default, GCC limits the size of functions that can be inlined. 
      This flag allows the control of this limit for functions that are 
      explicitly marked as inline (i.e., marked with the inline keyword 
      or defined within the class definition in c++). n is the size of 
      functions that can be inlined in number of pseudo instructions (not 
      counting parameter handling). The default value of n is 600. 
      Increasing this value can result in more inlined code at the cost 
      of compilation time and memory consumption. Decreasing usually 
      makes the compilation faster and less code will be inlined (which 
      presumably means slower programs). This option is particularly 
      useful for programs that use inlining heavily such as those based 
      on recursive templates with C++. 

      Inlining is actually controlled by a number of parameters, which 
      may be specified individually by using --param name=value. The 
      -finline-limit=n option sets some of these parameters as follows: 

      @item max-inline-insns-single 
      is set to I/2. 
      @item max-inline-insns-auto 
      is set to I/2. 
      @item min-inline-insns 
      is set to 130 or I/4, whichever is smaller. 
      @item max-inline-insns-rtl 
      is set to I. 

      See below for a documentation of the individual parameters 
      controlling inlining. 

      Note: pseudo instruction represents, in this particular context, an 
      abstract measurement of function's size. In no way, it represents 
      a count of assembly instructions and as such its exact meaning 
      might change from one release to an another. 
2

El siguiente es en el FAQ para el Sun Studio 11 compilador:

El compilador genera una función en línea como una función exigible ordinario (fuera de línea) cuando cualquiera de las siguientes situaciones:

  • Compila con + d.
  • Compila con -g.
  • La dirección de la función es necesaria (como con una función virtual).
  • La función contiene estructuras de control que el compilador no puede generar en línea.
  • La función es demasiado compleja.

De acuerdo con la respuesta a esta post por 'clamage45' las "estructuras de control que el compilador no puede generar en línea" son:

  • la función contiene construcciones prohibidas, como bucle , conmutador o Goto

Otra lista se pueden encontrar here. Como han indicado la mayoría de otras respuestas la heurística van a ser 100% compilador específico, por lo que he leído creo para asegurar que una función inline es en realidad que hay que evitar:

  • variables estáticas locales
  • bucle construye
  • sentencias switch
  • try/catch
  • Goto
  • recursividad
  • y, por supuesto, demasiado complejo (sea lo que m eans)
Cuestiones relacionadas