Espacios de nombres
Variantes
Acciones

Especificador inline

De cppreference.com
< cpp‎ | language
 
 
 
 

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:

  1. 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).
  2. 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.
  • Los literales de cadena en todas las definiciones de funciones se comparten (todos son el mismo literal de cadena definido en una sola unidad de traducción)
(hasta C++17)

Las variables const en línea en el ámbito del espacio de nombres tienen enlace externo por defecto (a diferencia de las variables calificadas const, no volátiles, no en línea).

(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 inline para funciones llegó a significar "se permiten múltiples definiciones" en lugar de "se prefiere la inclusión en línea", ese significado se extendió a las variables.

(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