inline
hace dos cosas:
- le da una exención de la "una regla definición" (véase más adelante). Este siempre se aplica.
- Da al compilador una pista para evitar una llamada a la función. El compilador es libre de ignorar esto.
# 1 Puede ser muy útil (por ejemplo, poner definición en el encabezado si es corto) incluso si # 2 está deshabilitado.
En la práctica, los compiladores a menudo hacen un mejor trabajo al determinar qué alinearse ellos mismos (especialmente si está disponible la optimización guiada de perfil).
[EDIT: referencias completas y texto pertinente]
los dos puntos anteriores tanto siguen de la norma ISO/ANSI (ISO/IEC 9899: 1999 (E), comúnmente conocido como "C99") .
En §6.9 "Definición externo", párrafo 5:
Un definición externa es una declaración externa que es también una definición de una función (que no sea una definición en línea) o un objeto. Si se utiliza un identificador declarado con enlace externo en una expresión (que no sea parte del operando de un operador sizeof cuyo resultado es una constante entera), en alguna parte del programa completo habrá exactamente una definición externa para el identificador; de lo contrario, no habrá más de uno.
Si bien la definición equivalente en C++ se denomina explícitamente Regla de una definición (ODR) tiene el mismo propósito. Externo (es decir, no "estático", y por lo tanto local a una sola Unidad de traducción, generalmente un solo archivo de origen) solo se puede definir una vez solo a menos que sea una función y en línea.
En §6.7.4, "función de especificadores", se define la palabra clave en línea:
haciendo una función de una función en línea sugiere que las llamadas a la función de ser lo más rápido posible . [118] El grado en que tales sugerencias son efectivas es definido en la implementación.
y la nota (no normativo), pero proporciona aclaración:
Mediante el uso de, por ejemplo, una alternativa al mecanismo de llamada a la función de costumbre, tales como ‘‘inline sustitución’’. La sustitución en línea no es una sustitución textual, ni crea una nueva función. Por lo tanto, por ejemplo, la expansión de una macro utilizada dentro del cuerpo de la función usa la definición que tenía en el punto en que aparece el cuerpo de la función, y no donde se llama a la función; e identificadores se refieren a las declaraciones en el alcance donde ocurre el cuerpo. Del mismo modo, la función tiene una sola dirección, independientemente de la cantidad de definiciones en línea que se producen además de la definición externa.
Resumen: lo que la mayoría de los usuarios de C y C++ esperan de la línea no es lo que obtienen. Su objetivo principal aparente, para evitar gastos generales de llamadas funcionales, es completamente opcional. Pero para permitir la compilación por separado, se requiere una relajación de la definición única.
(Todo el énfasis en las citas de la norma.)
EDIT 2: Algunas notas:
- Hay varias restricciones a las funciones en línea externos. No puede tener una variable estática en la función y no puede hacer referencia a objetos/funciones de alcance de TU estáticas.
- Acabo de ver esto en "whole program optimisation" de VC++, que es un ejemplo de un compilador que hace su propia cosa en línea, en lugar del autor.
Sospecho que, al igual que el "registro" se volvió obsoleto a finales de la década de 1980, "en línea" ha quedado obsoleto durante varios años. –
\ o /, muere "en línea"! – elmarco
Inline definitivamente no está obsoleto. ¿Alguna vez has leído el código fuente de un kernel moderno? Inline es irrelevante para las personas que escriben aplicaciones, pero esas personas no deberían usar C hoy en día de todos modos, y es tan relevante para la programación de sistemas como lo fue alguna vez. – nosatalian