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.
no es una solicitud - es una recomendación. La decisión depende del compilador – chester89