[C++] Función en línea ⑤ (Resumen de función en línea | Ejemplo de código de función en línea)





1. Resumen de funciones en línea



Recuerde las funciones en línea introducidas en el blog anterior:

  • Compilación de funciones en línea: cuando el compilador de C ++ compila una función en línea , insertará directamente la instrucción del cuerpo de la función en línea en la posición donde se llama la función en línea;
  • Las solicitudes en línea serán rechazadas: use la palabra clave en línea para modificar funciones ordinarias y convertirlas en funciones en línea. Es posible que el compilador no esté de acuerdo con la solicitud en línea. Si hay declaraciones de bucle/ muchas declaraciones de juicio condicional/ cuerpo de función grande/ para funciones Tome el operación de dirección / declarar la función en línea por separado, incluso si la función en línea está escrita, el compilador no aceptará la solicitud en línea;
  • Ventajas de las funciones en línea: en comparación con las funciones ordinarias, las funciones en línea tienen la ventaja de eliminar la sobrecarga de empujar/saltar/regresar cuando se llama a la función;




2. Ejemplo de código de función en línea




1. Ejemplo de código: análisis de ejecución de funciones comunes


llamar a int c = fun1(++a, b);código, fun1 es una función normal;

Cuando se ejecuta,

Primero, ejecute el autoincremento de a, luego la variable a = 2;

Luego, ejecute la función ordinaria fun1, pase dos parámetros, pase a = 2, b = 3 como parámetros reales a la función ordinaria;

Finalmente, la función ordinaria devuelve el valor menor de a = 2, b = 3, y lo asigna a c = a = 2;

Por tanto, el resultado final es: a = 2, b = 3, c = 2;


Ejemplo de código: análisis de ejecución de funciones en línea:

// 导入标准 io 流头文件 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;

// 声明内联函数 不会报错 程序能正常运行
// 但是不建议这样做
// 一旦像这样声明 内联函数 
// 编译器 编译时 会拒绝该内联函数的 内联请求 
// 将其作为普通函数处理
//inline int fun(int a, int b);

// 宏代码片段 : 获取 a 和 b 中较小的值
#define FUN(a, b) ((a) < (b) ? (a) : (b))

// 内联函数 : 获取 a 和 b 中较小的值
inline int fun(int a, int b)
{
    
    
    return a < b ? a : b;
}

// 普通函数 : 获取 a 和 b 中较小的值
inline int fun1(int a, int b)
{
    
    
    return a < b ? a : b;
}

int main() {
    
    

    
    int a = 1;
    int b = 3;

    // 调用普通函数
    // 此时先执行 a 的自增 a = 2
    // 然后再执行函数 , 将 a = 2 , b = 3 传入
    // 结果得到 a b 中较小的值 c = a = 2
    int c = fun1(++a, b);

    // 打印内联函数调用结果
    printf("a = %d, b = %d, c = %d\n", a, b, c);

    // 控制台暂停
    system("pause");

    return 0;
}

Resultados de:

a = 2, b = 3, c = 2
请按任意键继续. . .

inserte la descripción de la imagen aquí


2. Ejemplo de código: análisis de ejecución de funciones en línea


llamar a int c = fun(++a, b);código, fun es una función en línea;

Cuando se ejecuta,

Primero, ejecute el autoincremento de a, luego la variable a = 2;

Luego, ejecute la divertida función en línea, pase dos parámetros, pase a = 2, b = 3 como parámetros reales a la función en línea;

Finalmente, la función en línea devuelve el valor menor de a = 2, b = 3 y lo asigna a c = a = 2;

Por tanto, el resultado final es: a = 2, b = 3, c = 2;


El resultado de la ejecución de la función en línea es el mismo que el de la función ordinaria;


Ejemplo de código: análisis de ejecución de funciones en línea:

// 导入标准 io 流头文件 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;

// 声明内联函数 不会报错 程序能正常运行
// 但是不建议这样做
// 一旦像这样声明 内联函数 
// 编译器 编译时 会拒绝该内联函数的 内联请求 
// 将其作为普通函数处理
//inline int fun(int a, int b);

// 宏代码片段 : 获取 a 和 b 中较小的值
#define FUN(a, b) ((a) < (b) ? (a) : (b))

// 内联函数 : 获取 a 和 b 中较小的值
inline int fun(int a, int b)
{
    
    
    return a < b ? a : b;
}

// 普通函数 : 获取 a 和 b 中较小的值
inline int fun1(int a, int b)
{
    
    
    return a < b ? a : b;
}

int main() {
    
    

    
    int a = 1;
    int b = 3;

    // 调用内联函数
    // 此时先执行 a 的自增 a = 2
    // 然后再执行函数 , 将 a = 2 , b = 3 传入
    // 结果得到 a b 中较小的值 c = a = 2
    int c = fun(++a, b);

    // 打印内联函数调用结果
    printf("a = %d, b = %d, c = %d\n", a, b, c);

    // 控制台暂停
    system("pause");

    return 0;
}

Resultados de:

a = 2, b = 3, c = 2
请按任意键继续. . .

inserte la descripción de la imagen aquí


3. Ejemplo de código: análisis de ejecución de fragmentos de código macro


Ejecute int c = FUN(++a, b);código, llame al fragmento de código macro;

El fragmento de código de macro expande mecánicamente la macro en la etapa de precompilación, y el reemplazo de macro es muy mecánico;

El resultado de la macro sustitución es el siguiente: Reemplace ++a con la posición de a en FUN(a, b),

((++a) < (b) ? (++a) : (b))

El proceso de ejecución es el siguiente:

  • Primero, ejecute ++a para convertirse en 2;
  • Luego, compare 2 <3 y el resultado devuelto es (++a) En este momento, a debe incrementarse nuevamente para convertirse en 3;
  • Finalmente, devuelve a = 3, el valor mínimo es 3;

Ejemplo de código: análisis de ejecución de fragmentos de código macro:

// 导入标准 io 流头文件 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;

// 声明内联函数 不会报错 程序能正常运行
// 但是不建议这样做
// 一旦像这样声明 内联函数 
// 编译器 编译时 会拒绝该内联函数的 内联请求 
// 将其作为普通函数处理
//inline int fun(int a, int b);

// 宏代码片段 : 获取 a 和 b 中较小的值
#define FUN(a, b) ((a) < (b) ? (a) : (b))

// 内联函数 : 获取 a 和 b 中较小的值
inline int fun(int a, int b)
{
    
    
    return a < b ? a : b;
}

// 普通函数 : 获取 a 和 b 中较小的值
inline int fun1(int a, int b)
{
    
    
    return a < b ? a : b;
}

int main() {
    
    

    
    int a = 1;
    int b = 3;

    // 调用宏代码片段
    // 机械的将宏展开 , 宏替换很机械 
    // 宏替换结果如下 : 将 ++a 替换到 FUN(a , b) 中 a 的位置
    // ((++a) < (b) ? (++a) : (b))
    // 首先 , 执行 ++a 变为 2 , 
    // 然后 , 比较  2 < 3 , 返回结果是 (++a) 此时又要自增一次 a 变为 3
    // 最后 , a = 3 返回 , 最小值为 3
    int c = FUN(++a, b);

    // 打印内联函数调用结果
    printf("a = %d, b = %d, c = %d\n", a, b, c);

    // 控制台暂停
    system("pause");

    return 0;
}

Resultados de:

a = 3, b = 3, c = 3
请按任意键继续. . .

inserte la descripción de la imagen aquí

Acho que você gosta

Origin blog.csdn.net/han1202012/article/details/132655552
Recomendado
Clasificación