0
点赞
收藏
分享

微信扫一扫

【C++】内联函数与宏 inline & define

niboac 2022-01-23 阅读 108

内联函数与宏(inline & define)

使用inline修饰函数的声明或者实现,可以使其变成内联函数

写在声明或实现都可以,建议声明和实现都增加inline修饰。

内联函数声明必须在调用语句之前。

  • 作用?

    编译器会将函数调用直接展开为函数体代码
    在这里插入图片描述
    原本main函数中只有一行代码,但函数体中有三行代码,在编译时就会将一行代码自动展开成三行代码。

    • 有啥意义呢?

      在调用函数时,会开辟栈空间,函数结束后会回收栈空间。

      连续调用函数就会连续开辟回收栈空间。

      ——>> 内存开销较大

      如果使用内联函数,编译器会自动将函数展开成函数体代码,就不存在函数调用和开辟回收栈空间,不会分配和回收内存,执行效率会变高。

      ——>> 减少函数调用的开销

      但相应的会增大代码体积。

  • 使用场景:

    1. 函数体体积不是很大
    2. 频繁调用的函数
  • 注意

    1. 尽量不要内联超过10行代码的函数
    2. 不能存在任何形式的循环语句
    3. 不能存在过多的条件判断语句
    4. 有些函数即使声明为inline,也不一定会被编译器内联,比如递归函数,编译器可能拒绝内联请求
    5. 内联函数声明必须在调用语句之前。

define:

  • 只是简单的字符串替换,没有类型检查
  • 是在编译的预处理阶段起作用
  • 可以防止头文件重复引用
  • 不分配内存,给出的是立即数,有多少次使用就进行多少次替换

内联函数与宏

  • 都可以减少函数调用的开销
  • 对比宏,内联函数多了语法检测和函数特性(传参)
  • 在这里插入图片描述

输出:24而不是22

因为宏是简单的文本替换,替换后

int c = ++a + ++a; 

注意:按运算符优先级来说,++ 在 + 的前面,所以先对 a 做两次 ++ 运算,然后再将 a 值相加。
在这里插入图片描述

  • 在这里插入图片描述
    输出:22
    ++ a = 11 作为参数传入add函数,所以返回就是 11 + 11
  • 表达式
    C++有些表达式是可以被赋值的。
    在这里插入图片描述
    先计算 (a = b) ,将b赋值给 a,返回 a
    然后计算 a = 4, 将 4 赋值给 a,返回 a
    最终 a = 4, b = 2
    在这里插入图片描述
    a = 1, b = 4
    C++中可以,但C中不可以。
举报

相关推荐

0 条评论