• C++入门应该注意的问题(内联函数和C的宏)


    C++中的内联函数和C的宏关联非常强

    首先来回顾C语言中的宏,

    编写一些简单的宏函数实际上也是某些公司喜欢考的题

    首先我们来写一个ADD两个变量的宏函数:

    宏函数的第一点就是 :预处理的时候能不能替换,比如这个ADD函数

    上图中替换的时候要能保证原函数的作用不变,最主要的就是运算优先级。

    所以正确的写法如下:

    #define (a,b) ((a)+(b))

    下面总结一下宏

    宏的优点:代码的可维护性强、宏函数提高效率,减少了栈帧的建立

    宏的缺点:可读性差,没有类型安全检查(上面的参数是没有给类型的),不方便调试(被替换掉了)

    内联函数

    接下来说C++中的内联函数:

    如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字inline,在调用函数之前需要对函数进行定义。

    这里内联函数就是对宏的改进:

    1. inline int Add(int a int b)
    2. {
    3. return a+b;
    4. }

     

    上面这个是在配置后的debug环境下汇编代码,可以清楚的看到在做加法的时候,没有call指令。

     在兼具宏函数优点的情况下,这里其实几乎解决了宏函数的缺点

    所以侯捷老师说 尽量使用const、enum、inline去替代#define

    最后来介绍一下内联函数的特性:

    inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。
    inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等,编译器优化时会忽略掉内联。
    inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到
     

  • 相关阅读:
    CentOS 7 离线安装nginx1.18
    Spark【Spark SQL(三)DataSet】
    什么是glTF?glTF详解
    CentOS7.6升级内核到5.11及build RPM包
    Git 传文件到github
    【乱码】记一次C#调用Java乱码
    Python小练习一
    第14篇ESP32 idf wifi联网_WiFi STA 模式(连接到WIFI)LCD ST7920液晶屏显示
    【客户案例】脊叶架构(Spine-Leaf)的云化园区网络部署实践
    Redis数据类型之list
  • 原文地址:https://blog.csdn.net/yzy521wjm/article/details/126206639