Explicación detallada de los especificadores en línea de C++
Cuando el especificador en línea se utiliza en la "secuencia de descriptor de declaración" de una función, declara la función como una función en línea.
(1) Funciones de las funciones en línea
(2) Precauciones
La incorporación en línea se produce a expensas de la expansión y duplicación del código, y solo ahorra funciones. El costo de De este modo se mejora la llamada, mejorando así la eficiencia de ejecución de la función. Si el tiempo para ejecutar el código en el cuerpo de la función es mayor que el costo de la llamada a la función, entonces la ganancia de eficiencia será pequeña. Por otro lado, el código debe copiarse cada vez que se llama a la función en línea, lo que aumentará el tamaño total del código del programa y consumirá más espacio de memoria.
No es adecuado utilizar funciones en línea: el código en el cuerpo de la función es demasiado largo o hay declaraciones en bucle. En este caso, suele ser más caro utilizar funciones en línea.
(3) La situación de las funciones en línea implícitas
(4) Conocimiento detallado
A partir de C++ 17, la palabra clave en línea define la función Cambiado de "priorizar la inserción" para "permitir múltiples definiciones", por lo que el significado se extiende a las variables.
El especificador en línea, cuando se usa dentro de una "secuencia de descriptor de declaración" de una variable con período de almacenamiento estático (miembro de clase estática o variable con ámbito de espacio de nombres), declara la variable como una variable en línea. Las variables miembro estáticas (variables de alcance que no pertenecen al espacio de nombres) declaradas como constexpr son variables implícitamente en línea.
La función principal de las variables en línea es que incluso si varios archivos hacen referencia al objeto global definido, solo habrá un objeto global, es decir, las variables en línea son únicas. Las variables en línea se declararán implícitamente externas (enlace externo).
Las variables en línea eliminan un obstáculo importante para empaquetar código C++ en una biblioteca de solo encabezado.
La combinación de variables en línea y thread_local puede definir una variable en línea para cada hilo (thread_local es una palabra clave agregada en C++11). Por ejemplo:
Las variables en línea son una característica del lenguaje central C++17 y se describen en la propuesta P0386R2 (ver documento: http://www.open-STD.org/JTC 1/SC22 / WG 21/Docs/Papers/2016/P Consulte la siguiente tabla para cada compatibilidad del compilador:
Desde el estándar C++17, si el compilador admite variables en línea se puede determinar juzgando si la macro __cpp_inline_variables es Juicio definido, por ejemplo:
Las funciones en línea o variables en línea tienen los siguientes atributos:
(1) Puede haber múltiples definiciones en el programa, siempre que cada definición aparezca en. una unidad de traducción diferente (para funciones y variables en línea no estáticas) y todas las definiciones son equivalentes. Por ejemplo, una función en línea o una variable en línea se pueden definir en un archivo de encabezado # que se incluye en varios archivos fuente. (2)Debe declararse en línea en cada unidad de traducción
(3)Cada unidad de traducción tiene la misma dirección