Características de las funciones en línea

1. El papel de en línea (función en línea)

Podemos crear una función en línea utilizando la palabra clave en línea junto con la definición de la función. Su función es reducir la sobrecarga de las llamadas a funciones. Si hay una función en nuestro programa que se llamará con frecuencia, esto hará que el programa se ejecute muy lentamente. Entonces podemos usar funciones en línea para resolver este problema y mejorar la eficiencia de ejecución del programa.

Definición de función en línea:

inline void add(int a, int b){
    return a+b;
}

Lo anterior es una función en línea. Si la operación de agregar se usa con frecuencia en nuestro programa, declararla como una función en línea puede reducir la sobrecarga de llamadas y mejorar la eficiencia.

Nota:  1. La palabra clave en línea es una "palabra clave para implementación", no una "palabra clave para declaración". En otras palabras, en línea solo se puede colocar antes de la definición de una función para hacer que la función sea interna Una función asociativa no es válida cuando se coloca antes de la declaración de la función.

         2. Otro punto es: las funciones miembro definidas en las clases de C++ son funciones en línea por defecto, pero solo si están definidas en la clase, porque nuestra forma normal de definir clases es declarar las variables miembro y las funciones miembro de la clase en el encabezado. archivo. , Defina la función miembro de la clase en el archivo original. En este momento, la definición de la función miembro ocurre fuera de la clase, por lo que ya no es una función en línea. Si queremos convertirla en una función en línea, debemos necesita agregar manualmente en línea.

         3. En cuanto al primer punto, ¿por qué digo que la función puede convertirse en una función en línea, porque en línea es una palabra clave recomendada, no garantiza que la función se convierta en una función en línea, pero el compilador está compilando cuando obtiene un función con sugerencias en línea, juzgue su escala, contenido, método y otros elementos. Si cumple con los requisitos del compilador, la función se convertirá en una función en línea, de lo contrario, no se convertirá en una función en línea, así que si es una función en línea o not es completamente compilado por el compilador.El dispositivo tiene la última palabra.

2. Implementación de funciones en línea (tenga en cuenta que las funciones en línea no se expandirán en el modo de depuración)

Dado que la función en línea puede reducir la sobrecarga de llamadas de la función, ¿cómo lo implementa? Muy simple, expandimos su código en todos los lugares donde se llama a la función en línea, lo que aumentará la cantidad de código, pero lo reducirá. la sobrecarga de llamadas es una práctica típica de espacio por tiempo.

Pasamos el compilador al modo Release para usar la función en línea, y podemos ver cómo se implementa bajo las instrucciones de ensamblaje.

Código fuente:

#include<iostream>
using namespace std;

inline int add(int a, int b) {
	return 0;
}

int main() {
	int b=add(1, 2);
	cout << b << endl;
	return 0;
}

(modo de depuración) desmontaje:

En el modo de depuración, podemos ver claramente que cuando el programa ejecuta la función de agregar, dos parámetros 2 y 1 se colocan en la pila y se llama a la función de agregar.

(Modo de liberación) Desmontaje:

En este punto, podemos ver que, al igual que la pila de inserción de parámetros anterior, no hay llamada de función, esa es la función en línea, la implementación es exitosa y la función de agregar no se llamará más aquí, pero la función de agregar sí. ser expandido directamente Ponga su código aquí para realizar directamente la operación a+b, evitar llamadas de función y aumentar su eficiencia operativa.

3. Precauciones para el uso en línea

Como mencioné anteriormente, el uso de funciones en línea es una forma de consumir espacio y ganar tiempo, por lo que debemos comprender el grado de esto. Cuando la escala del programa es demasiado grande, la sobrecarga de su código que se ejecuta supera con creces la de nuestra función. llamadas En este momento, el beneficio es muy pequeño, y no es necesario usar la función en línea, y la función en línea no se puede usar cuando la función de memoria es recursiva o en bucle, y el compilador no la convertirá en una función en línea.

Código fuente:

#include<iostream>
using namespace std;

inline int mul(int a) {//求a的阶乘
	if (a <= 0) {
		return 1;
	}
	return a * mul(a - 1);
}

int main() {
	int b=mul(10);
	cout << b << endl;
	return 0;
}

(Modo de liberación) Desmontaje:

En este momento, en la instrucción de desensamblado del modo Release, vemos que la función mul no está expandida, pero se realiza una llamada a la función, lo que indica que el compilador no la ha convertido en una función en línea.

4. La diferencia entre en línea y preprocesamiento

Sabemos que la sustitución de macros ocurrirá en la etapa de preprocesamiento. La sustitución de macros consiste en reemplazar el código o los datos definidos por macros con macros en las que se usan macros en el código. En línea también consiste en copiar el código en la función a la función en línea que llama. lugar, entonces, ¿cuál es la diferencia entre ellos? El reemplazo de macros es solo un reemplazo simple y no es seguro, y cuando se usa una función en línea, el compilador juzgará la corrección de la llamada de función en línea. Si es incorrecta, la operación no se realizará sucederá, por lo que es más seguro, por lo que todo el código de macro en C ++ debe reemplazarse con funciones en línea. 

Supongo que te gusta

Origin blog.csdn.net/weixin_49312527/article/details/123503198
Recomendado
Clasificación