zoukankan      html  css  js  c++  java
  • 深入理解C++中内联inline函数和宏定义的区别

    inline函数是C++引入的机制,目的是解决使用宏定义的一些缺点。

    内联函数与宏定义区别

    (1)内联函数在编译时展开,宏在预编译时展开;

    (2)内联函数直接嵌入到目标代码中,宏是简单的做文本替换;

    (3)内联函数有类型检测、语法判断等功能,宏没有;

    (4)inline函数是函数,宏不是;

    (5)宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义;

    为什么要引入内联函数?

    用内联函数替代宏定义,消除宏定义的缺点:

    • 宏定义使用预处理器实现,做一些简单的字符替换,因此不能进行参数有效性的检测。
    • 宏定义的返回值不能被强制转换为可转换的合适类型。
    • C++中引入了类及类的访问控制,在涉及到类的保护成员和私有成员就不能用宏定义来操作。

    inline相比宏定义有哪些优越性

    (1)inline函数代码是被放到符号表中,使用时像宏一样展开,没有调用的开销,效率很高;

    (2)inline函数是真正的函数,所以要进行一系列的数据类型检查;

    (3)inline函数作为类的成员函数,可以使用类的保护成员及私有成员;

    inline函数使用的场合

    (1)使用宏定义的地方都可以使用inline函数;

    (2)作为类成员接口函数来读写类的私有成员或者保护成员;

    为什么不能把所有的函数写成inline函数?

    内联函数以代码复杂为代价,它以省去函数调用的开销来提高执行效率。
    一方面如果内联函数体内代码执行时间相比函数调用开销较大没有太大的意义;
    另一方面每一处内联函数的调用都要复制代码,消耗更多的内存空间,因此以下情况不宜使用内联函数:

    (1)函数体内的代码比较长,将导致内存消耗代价;

    (2)函数体内有循环,函数执行时间要比函数调用开销大;

    参考

    https://www.cnblogs.com/evenleee/p/10970320.html

  • 相关阅读:
    python
    ASCII码表
    maven使用阿里云maven库
    eclipse中使用maven的 maven install
    软件项目版本号的命名规则及格式
    win7局域网内共享文件夹及安全设置
    restful返回 json数据的JavaBean设计
    关于StringUtils类isEmpty、isNotEmpty、isBlank、isNotBlank针对null、空字符串和空白字符(如空格、制表符)的区别
    maven如何引入servlet-api和jsp-api
    NetBeans的(默认)快捷键
  • 原文地址:https://www.cnblogs.com/liutongqing/p/13591174.html
Copyright © 2011-2022 走看看