Directorio de artículos
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
请按任意键继续. . .
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
请按任意键继续. . .
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
请按任意键继续. . .