• 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被展开,就没有函数地址了,链接就会找不到
     

  • 相关阅读:
    Go 实现程序优雅退出
    【思考】我为钱工作 OR 钱为我工作?
    软件测试曾拿过十几份offer的简历是什么样子的?
    Webpack 解决:ReferenceError: dist is not defined 的问题
    嵌入式C常见面试题
    ChatGPT 提示词技巧一本速通
    HTML基础学习第五篇(HTML表单与输入)
    [2023.09.11]: Yew的SSR中的Cargo.toml配置
    CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!)
    RecyclerView源码解析(二):结合LinearLayout分析绘制流程
  • 原文地址:https://blog.csdn.net/yzy521wjm/article/details/126206639