Especificador inline
El especificador inline cuando se usa en la sec-decl-especificadores de una función, declara la función ser una función en línea.
Una función definida en su totalidad dentro de una class/struct/definición de unión, ya sea una función miembro o una función no miembro friend, es implícitamente una función en línea.
Una función declarada constexpr es implícitamente una función en línea. Una función eliminada es implícitamente una función en línea: su definición (eliminada) puede aparecer en más de una unidad de traducción. |
(desde C++11) |
El especificador inline, cuando se usa en una sec-decl-especificadores de una variable con duración de almacenamiento estático (miembro de clase estática o variable de ámbito de espacio de nombres), declara la variable ser una variable en línea. Una variable miembro estática (pero no una variable de ámbito de espacio de nombres) declarada constexpr es implícitamente una variable en línea. |
(desde C++17) |
Contenido |
[editar] Descripción
Una función en línea o variable en línea (desde C++17) tiene las siguientes propiedades:
- La definición de una función en línea o variable (desde C++17) debe ser accesible en la unidad de traducción donde se accede (no necesariamente antes del punto de acceso).
- Una función en línea o variable (desde C++17) con enlace externo (por ejemplo, no declarado static) tiene las siguientes propiedades adicionales:
- Puede haber más de una definición de una función en línea variable (desde C++17) en el programa siempre que aparezca cada definición en una unidad de traducción diferente y (para funciones en línea no estáticas y variables (desde C++17)) todas las definiciones son idénticas. Por ejemplo, una función en línea o una variable en línea (desde C++17) se puede definir en un archivo de encabezado que está incluido en varios archivos fuente.
- Debe declararse inline en cada unidad de traducción.
- Tiene la misma dirección en cada unidad de traducción.
En una función en línea:
- Los objetos estáticos locales de función en todas las definiciones de funciones se comparten en todas las unidades de traducción (todas se refieren al mismo objeto definido en una unidad de traducción).
- Los tipos definidos en todas las definiciones de funciones también son iguales en todas las unidades de traducción.
|
(hasta C++17) |
Las variables |
(desde C++17) |
La intención original de la palabra clave inline
era servir como un indicador para el optimizador de que la sustitución en línea de una función es preferible a la llamada de función, es decir, en lugar de ejecutar la llamada a la función de la CPU para transferir el control al cuerpo de la función, se ejecuta una copia del cuerpo de la función sin generar la llamada. Esto evita el costo extra creado por la llamada a la función (pasando los argumentos y recuperando el resultado) pero puede resultar en un ejecutable más grande ya que el código para la función debe repetirse varias veces.
Dado que este significado de la palabra clave inline no es vinculante, los compiladores pueden usar la sustitución en línea para cualquier función que no esté marcada inline
, y son libres de generar llamadas de función a cualquier función marcada inline
. Esas opciones de optimización no cambian las reglas con respecto a múltiples definiciones y variables estáticas compartidas mencionadas anteriormente.
Como el significado de la palabra clave |
(desde C++17) |
[editar] Notas
Si una función en línea o variable (desde C++17) con enlace externo se define de manera diferente en diferentes unidades de traducción, el comportamiento es indefinido.
El especificador inline
no se puede utilizar con una declaración de una función o variable (desde C++17) en el ámbito de bloque (dentro de otra función).
El especificador inline
no puede volver a declarar una función o variable (desde C++17) que ya se definió en la unidad de traducción como no en línea.
Las funciones miembro generadas implícitamente y cualquier función miembro declarada como predeterminada/por defecto (= default) en su primera declaración están en línea como cualquier otra función definida dentro de una definición de clase.
Si se declara una función en línea en diferentes unidades de traducción, los conjuntos acumulados de los argumentos por defecto deben ser los mismos al final de cada unidad de traducción.
En C, las funciones en línea no tienen que ser declaradas en línea en cada unidad de traducción (a lo sumo, una puede ser no inline
o extern inline
), las definiciones de funciones no tienen que ser idénticas (pero el comportamiento del programa no debe depender de cuál se llama) y las variables estáticas locales a la función son distintas entre diferentes definiciones de la misma función.
Véase datos miembro estáticos para reglas adicionales sobre los datos miembro estáticos en línea. Las variables en línea eliminan el obstáculo principal para empaquetar código de C++ como bibliotecas de solo encabezado. |
(desde C++17) |
[editar] Ejemplo
// archivo de encabezado #ifndef EJEMPLO_H #define EJEMPLO_H // función incluida en múltiples archivos fuente tiene que ser inline inline int sum(int a, int b) { return a + b; } #endif // archivo fuente #2 #include "example.h" int a() { return sum(1, 2); } // archivo fuente #1 #include "example.h" int b() { return sum(3, 4); }
[editar] Véase también
Documentación de C para inline
|