inline, __inline, __forceinline
Los especificadores de inline y de __inline indican al compilador que inserte una copia del cuerpo de la función en cada lugar llamar a la función.
inline function_declarator;
__inline function_declarator; // Microsoft Specific
__forceinline function_declarator; // Microsoft Specific
Comentarios
Inserción (denominada expansión en línea o la inclusión) sólo aparece si la presentación de análisis de costo/marcado de compilador él para ser rentable.La expansión en línea libera la sobrecarga de la llamada de función en el costo potencial de un tamaño de código más grande.
La palabra clave de __forceinline reemplaza el análisis de costo/marcado y se basa en intervención de programador en su lugar.La práctica advertir al utilizar __forceinline.El uso indistinto de __forceinline puede dar lugar a un código más grande sólo con las mejoras de rendimiento marginal o, en algunos casos, incluso las pérdidas de rendimiento (debido a la paginación más de una aplicación ejecutable mayor, por ejemplo).
Utilizar funciones inline puede hacer que el programa más rápido porque elimina la sobrecarga asociada con llamadas de función.Las funciones expandieron insertados están sujetos a las optimizaciones de código no disponible para las funciones normales.
El compilador trata las opciones de expansión en línea y sus palabras clave como sugerencias.No hay ninguna garantía de que las funciones inline.No puede hacer que el compilador en línea una función concreta, incluso con la palabra clave de __forceinline .Al compilar con /clr, el compilador no incluye en línea una función si hay atributos de seguridad aplicado a la función.
La palabra clave de Alineado solo está disponible en C++.Las palabras clave de __inline y de __forceinline están disponibles en C y C++.Por compatibilidad con versiones anteriores, _inline es un sinónimo de __inline.
La palabra clave de Alineado indica al compilador que la expansión en línea está preferida.Sin embargo, el compilador puede crear una instancia independiente de la función (crear instancias) y crear lo acopla estándar de llamada en lugar de incrustar el código insertado.Dos casos en los que esto puede ocurrir son:
Funciones recursivas.
Funciones que se hace referencia mediante un puntero a otra parte de la unidad de traducción.
Estas razones pueden interferir con la, al igual que otros, a discreción del compilador; no debe depender del especificador de Alineado para producir una función que se insertadas.
Como con funciones normales, no hay ningún orden definido de evaluación de los argumentos de una función inline.De hecho, podría ser diferente del orden en que se evalúan los argumentos cuando se pasan mediante el protocolo normal de la llamada de función.
La opción de optimización de compilador de /Ob ayuda a determinar si la expansión de funciones inline aparece realmente.
/LTCG realiza el desactiva la independientemente de si se ha solicitado en código fuente.
Ejemplo 1
// inline_keyword1.cpp
// compile with: /c
inline int max( int a , int b ) {
if( a > b )
return a;
return b;
}
Las funciones miembro de una clase se pueden declarar en línea mediante la palabra clave de Alineado o colocando la definición de función en la definición de clase.
Ejemplo 2
// inline_keyword2.cpp
// compile with: /EHsc /c
#include <iostream>
using namespace std;
class MyClass {
public:
void print() { cout << i << ' '; } // Implicitly inline
private:
int i;
};
Específicos de Microsoft
la palabra clave de __inline es equivalente a Alineado.
Incluso con __forceinline, el compilador no puede código escrito en todas las circunstancias.El compilador no puede en línea una función si:
La función o el llamador es compilado con /Ob0 (la opción predeterminada para las compilaciones de depuración).
La función y el llamador utilizan diferentes tipos de control de excepciones (control de excepciones de C++ en uno, control de excepciones estructurado en otro).
La función tiene una lista de argumentos de variable.
La función utiliza el ensamblado en línea, a menos que se compile con /Og, /Ox, /O1, o /O2.
La función es recursiva y no acompañada por inline_recursion #pragma (on).Con el pragma, las funciones recursivas entre líneas hasta predeterminada de 16 llamadas.Para disminuir el nivel de inclusión, utilice el pragma de inline_depth .
la función es virtual y se denomina virtualmente.Las llamadas directas a las funciones virtuales pueden insertadas.
El programa toma la dirección de la función y la llamada se realiza a través del puntero a función.Las llamadas directas a las funciones que han tenido su dirección tomada pueden insertadas.
La función también se marcan con el modificador de naked__declspec .
Si el compilador no incluye en línea una función declarada con __forceinline, genera una advertencia de nivel 1.
Las funciones recursivas pueden ser especificado sustituido hasta especificada por el pragma de inline_depth , hasta un máximo de 16 llamadas.Dicha profundidad, las llamadas de función recursiva se trata como llamadas a una instancia de la función.La profundidad a las funciones recursivas son examinadas por la heurística especificado no puede ser superior a 16.La pragma de inline_recursion controla la expansión en línea de una función actualmente en extensión.Vea la opción del compilador Expansión de funciones inline (/Ob) para información relacionada.
Específico de Microsoft de FINAL
Para obtener más información sobre cómo usar el especificador de Alineado , vea: