【C++】内联函数 ⑤ ( 内联函数总结 | 内联函数代码示例 )

文章目录

  • 一、内联函数总结
  • 二、内联函数代码示例
    • 1、代码示例 - 普通函数执行分析
    • 2、代码示例 - 内联函数执行分析
    • 3、代码示例 - 宏代码片段执行分析





一、内联函数总结



回顾下 之前的博客中 介绍的 内联函数 :

  • 内联函数编译 : C++ 编译器 编译 内联函数 时 , 会直接 将 内联函数 函数体 指令插入到 调用 内联函数 的位置 ;
  • 内联请求会被拒绝 : 使用 inline 关键字 修饰 普通函数 , 将其转化为 内联函数 , 编译器不一定同意该 内联请求 , 如果 有循环语句 / 有很多条件判定语句 / 函数体庞大 / 对函数取地址操作 / 单独声明内联函数 , 即使写了 inline 内联函数 , 编译器也不会同意内联请求 ;
  • 内联函数优势 : 内联函数 与 普通函数 对比 , 其优势只是 省去了 函数调用时 的 压栈 / 跳转 / 返回 的开销 ;




二、内联函数代码示例




1、代码示例 - 普通函数执行分析


调用 int c = fun1(++a, b); 代码 , fun1 是 普通函数 ;

执行时 ,

首先 , 执行 a 的自增 , 之后变量 a = 2 ;

然后 , 执行 fun1 普通函数 , 传入两个参数 , 将 a = 2 , b = 3 当做实参 传入 普通函数 ;

最后 , 普通函数 返回 a = 2 , b = 3 中 较小的值 , 赋值给 c = a = 2 ;

因此 , 最终得到的结果是 : a = 2 , b = 3 , c = 2;


代码示例 - 内联函数执行分析 :

// 导入标准 io 流头文件 其中定义了 std 命名空间
#include 
// 导入 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;
}

执行结果 :

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

【C++】内联函数 ⑤ ( 内联函数总结 | 内联函数代码示例 )_第1张图片


2、代码示例 - 内联函数执行分析


调用 int c = fun(++a, b); 代码 , fun 是 内联函数 ;

执行时 ,

首先 , 执行 a 的自增 , 之后变量 a = 2 ;

然后 , 执行 fun 内联函数 , 传入两个参数 , 将 a = 2 , b = 3 当做实参 传入 内联函数 ;

最后 , 内联函数 返回 a = 2 , b = 3 中 较小的值 , 赋值给 c = a = 2 ;

因此 , 最终得到的结果是 : a = 2 , b = 3 , c = 2;


内联函数 的 执行结果 , 与 普通函数 的执行结果是一样的 ;


代码示例 - 内联函数执行分析 :

// 导入标准 io 流头文件 其中定义了 std 命名空间
#include 
// 导入 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;
}

执行结果 :

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

【C++】内联函数 ⑤ ( 内联函数总结 | 内联函数代码示例 )_第2张图片


3、代码示例 - 宏代码片段执行分析


执行 int c = FUN(++a, b); 代码 , 调用宏代码片段 ;

宏代码片段在 预编译阶段 机械的将宏展开 , 宏替换很机械 ;

宏替换结果如下 : 将 ++a 替换到 FUN(a , b) 中 a 的位置 ,

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

执行过程如下 :

  • 首先 , 执行 ++a 变为 2 ;
  • 然后 , 比较 2 < 3 , 返回结果是 (++a) 此时又要自增一次 a 变为 3 ;
  • 最后 , a = 3 返回 , 最小值为 3 ;

代码示例 - 宏代码片段执行分析 :

// 导入标准 io 流头文件 其中定义了 std 命名空间
#include 
// 导入 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;
}

执行结果 :

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

【C++】内联函数 ⑤ ( 内联函数总结 | 内联函数代码示例 )_第3张图片

你可能感兴趣的:(C++,c++,内联函数,宏代码片段,宏替换,内联)