一.宏定义:# define

1.为什么要使用宏?

因为调用宏比调用函数更有效率,函数的调用必须要将程序的执行顺序转移到函数所存放的内存地址中,将函数程序内容执行完后,再返回到执行该函数前的地方,这种转移操作要求执行前要保存现场并记忆执行地址,转回后要恢复现场,并按原来保存的地址继续执行,因此,函数调用有一定的时间和空间的开销,而宏只是在预处理的地方把代码展开,不需要额外的时间和空间开销,所以调用一个宏比调用一个函数更有效率

2.宏定义的最大好处:

宏定义的使用上像一个函数,但不是函数,它使用预处理器实现,没有了参数压栈,代码生成等一系列操作,因此效率很高

3.宏定义的缺点:

1)虽然宏定义类似一个函数,但在使用时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也就不能被强制转换为可转换的合适类型

2)宏定义不能访问类的成员变量

3)宏定义使用参数时,是严格的替换策略,无论你得参数时是何种形式,在展开代码中都是用形参数代替实参,这样,宏定义很容易产生二义性,它的使用就存在一系列的隐患

二.内联函数:inline

1.内联函数的介绍:

内联函数从源代码层看,有函数结构,而在编译后,却不具备函数性质,内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入每一个调用处,编译时,类似宏替换,使用函数体替换调用处的函数名,在代码中用inline关键字修饰,在类中声明的成员函数,自动转换为内联函数

1)类中的成员函数默认是内联函数(要求成员函数没有循环和递归,当其中存在循环的递归的时候,编译器会将其默认为一个普通函数处理)

2)内联函数不允许有循环或者递归语句

3)内联函数的定义必须出现在第一次调用内联函数之前

2.内联函数的优点:

1)有参数类型检测,更加安全

2)内联函数是在程序运行时展开,而且是进行参数传递

3)inline关键字只是对编译器的一个定义,如果函数本地不符合内联函数的标准,编译器就会将这个函数当作是普通函数

3.内联函数的缺点:

1)因为内联函数是在调用处展开,所以会使代码边长,占用更多内存

三.内联函数和宏定义的主要区别:

1)内联函数在运行时可调试,而宏定义不可以

2)编译器会对内联函数的参数类型做安全检查或自动类型转换,而宏定义则不会

3)内联函数可以访问类的成员变量,而宏定义则不能

【C++】内联函数(inline)和宏定义(# define)的优劣及其区别的更多相关文章

  1. (转载)内联函数inline和宏定义

    (转载)http://blog.csdn.net/chdhust/article/details/8036233 内联函数inline和宏定义   内联函数的优越性: 一:inline定义的类的内联函 ...

  2. 读书笔记 effective c++ Item 2 尽量使用const,枚举(enums),内联(inlines),不要使用宏定义(define)

    这个条目叫做,尽量使用编译器而不要使用预处理器更好.#define并没有当作语言本身的一部分. 例如下面的例子: #define ASPECT_RATIO 1.653 符号名称永远不会被编译器看到.它 ...

  3. 内联函数 inline

    (一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int ...

  4. C++ 内联函数inline

    http://blog.csdn.net/u011327981/article/details/50601800 1.  内联函数 在C++中我们通常定义以下函数来求两个整数的最大值: 复制代码 代码 ...

  5. 【转】ios内联函数 inline

    ios内联函数 inline 缘由 由于在学习使用UIScrollVew开发的过程中,碰到下面这个属性(设置内边距): @property(nonatomic) UIEdgeInsets scroll ...

  6. 内联函数inline的用法

    一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗.为了解决这个问题,特别的引入了inline修饰符,表示为内联函数.  栈空间就是指放 ...

  7. 07 c++中的内联函数inline

    文章链接: 问题描述:类中成员函数缺省默认是内联的,如果在类定义时就在类内给出函数定义,那当然最好.如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上 inline,否则就认为不是内联 ...

  8. 《挑战30天C++入门极限》新手入门:关于C++中的内联函数(inline)

        新手入门:关于C++中的内联函数(inline) 在c++中,为了解决一些频繁调用的小函数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数. 可能说到这里,很 ...

  9. 宏定义#define和内联函数inline的区别

    1 宏定义在预编译的时候进行字符串替换.内联函数在编译的时候进行函数展开. 2 宏定义没有类型检查.内联函数会进行参数列表.返回值等类型检查.

随机推荐

  1. 递归---Day29

    递归的概述 递归:指在当前方法内自己调用自己的方式叫做递归 递归的分类: 1.直接递归称为方法自身调用自己. 2.间接递归可以用A方法调用B方法,用B方法调用C方法,用C方法调用A方法. 递归的注意事 ...

  2. git分支的衍合

    一般我们使用衍合的目的,是想要得到一个能在远程分支上干净应用的补丁 — 比如某些项目你不是维护者,但想帮点忙的话,最好用衍合:先在自己的一个分支里进行开发,当准备向主项目提交补丁的时候,根据最新的 o ...

  3. MUI下拉菜单样式

    <div class="mui-input-row my_select"> <label style="width: 47px;padding-righ ...

  4. cs1.6 人物地址查询

    打开游戏 控制台命令 增加一个BOT:bot_add 增加一个警察:bot_add_ct 增加一个匪徒:bot_add_t 让BOT站在原地不动:bot_stop 1 "-"减号: ...

  5. 1 Ubuntu 破解帐户密码

    1.  重启Ubuntu  长按shift进入grub界面 2.  选择recovery mode模式,进入Recovery Menu界面选择 root        Drop to root she ...

  6. httpclient解析

    1.HttpClient简介 HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性,它不仅使客户端发送Http请求变得容易,而且也方便开发人员测试接口(基于Http ...

  7. Linux的基本指令(2)-Linux从入门到精通第三天(非原创)

    文章大纲 一.高级指令二.练习题三.学习资料下载四.参考文章   一.高级指令 1. hostname指令 作用:操作服务器的主机名(读取.设置)语法1:#hostname 含义:表示输出完整的主机名 ...

  8. csv数据的读取和写入,以及好看的可视化

    参考: https://www.jianshu.com/p/5511cb3bdbb1 https://www.baidu.com/link?url=fbslMHoMviGOyn5Ub36VGdVQBD ...

  9. Linux文件服务管理之Samba

    Linux文件服务器的搭建            Samba      vsftpd      nfs       Samba服务                     作用:共享目录        ...

  10. 综合架构之Rsync备份服务,服务端和客户端配置

    服务端配置(即备份服务器) ps:客户端配置见下方 配置一个新服务的步骤: 第一步:先将该服务下载 yum install -y rsync 第二步:编写服务配置文件 配置文件:/etc/rsyncd ...