内联函数与宏定义函数的异同

一、宏函数
    #define FUNC(arg) arg*10
    不是真正的函数,就是带参数的宏,使用宏函数的位置会先替换成宏函数后面的代码,然后根据提供的参数替换掉对应参数的位置
    注意:可以使用续行符和大括号来保护代码
    二义性:
        由于宏所处位置或参数不同可能导致宏有多种解释,这就叫宏的二义性
        可以在最外层加小括号,每个参数都加小括号,以此降低产生二义性的可能,不要在宏中使用自变运算符
    运算符:
        #   把宏函数的参数变成字符串
        ##  合并两个参数变成标识符

二、内联函数(函数前面+inline)
    1、普通函数
        普通函数会被翻译成二进制指令存储在代码段中,调用语句会生成一句跳转指令,当程序运行到跳转语句时,就会跳转到函数所在的代码段中的位置执行,执行完后会跳转返回。
    2、什么是内联函数
        内联函数也会被翻译成二进制指令,调用语句不会生成跳转指令,而是直接把内联函数的二进制指令替换调用语句,这样就没有发生跳转和返回,而是直接执行被调用函数,我们把这种函数称为内联函数
    3、显式内联和隐式内联
        显式内联:在函数的返回值之前添加 inline 该函数就以内联机制调用,但并不是所有的编译器都支持,我们现在使用的gcc以及g++就不支持

        隐式内联:结构、联合、类的成员函数会自动被当做内联函数处理
    4、内联适用的条件
        内联的优点:
            节约了函数传参、跳转、返回的时间,提高代码的运行速度
        内联的缺点:
            当内联函数在多个位置调用时,那么该函数的二进制指令就会形成多份,造成代码冗余,因此最终的可执行文件大小增加
        适用条件:
            1、适合内容简单且频繁调用的函数(一次调用执行多次),内容多且多次出现调用语句的函数就不适合内联,因为它节约的时间弥不了牺牲的内存
            2、带有递归属性的函数无法内联,编译器会自动忽略inline关键字

总结:

相同点:
    都是采用以空间换时间的策略,来提高程序的执行速度
不同点:(不同点于宏函数和普通函数的不同点相同)
    1、宏函数不是真正的函数,而是语句的替换,不会传参,没有类型检查,没有返回值,安全性低,具有二义性
    2、内联函数是真正的函数,会传参,有严格的类型检查、有返回值、比宏函数安全

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值