C++ - 内联函数与宏定义

1.宏定义

宏不是由编译器来处理,而是由预处理器来处理,使用宏其实就是文本替换,是一个直接赋值粘贴的过程,并没有变量类型之类的检查,所以说宏是有副作用的,副作用就是没有类型检查。

在C++中使用内联函数来替代宏代码片段,C++中使用inline关键字声明内联函数。

inline int func(int a,int b)
{
	return a < b ? a : b; 
}

2.内联函数

-> C++编译器可以将一个函数进行内联编译。
-> 被C++编译器内联编译的函数叫做内联函数。
-> C++编译器直接将函数体插入到函数调用的地方。
-> 内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)。

示例:初识内联函数

#include <stdio.h>

#define FUNC(a, b) ((a) < (b) ? (a) : (b))

inline int func(int a, int b)
{
    return a < b ? a : b;
}

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 3;
    //int c = FUNC(++a, b);
	int c = func(++a, b); 
    
    printf("a = %d\n", a);  //宏定义调用3,内联函数调用2
    printf("b = %d\n", b);  //宏定义调用3,内联函数调用3
    printf("c = %d\n", c);  //宏定义调用3,内联函数调用2
    
    return 0;
}

-> 内联函数具有普通函数的特征(参数检查,返回类型等)。
-> 函数的内联请求可能被编译器拒绝。
-> 函数被内联编译后,函数体直接扩展到调用的地方。

内联函数的效率是不会输给宏定义的,但是会比宏定义安全,所以在C++中首选是内联函数而不是宏代码块了。

示例:深度解析内联函数

->  C++中可以通过inline声明内联函数。
->  编译器直接将内联函数体扩展到函数调用的地方。
->  inline只是一种请求,编译器不一定允许这种请求。
->  内联函数省去了函数调用时压栈,跳转和返回的开销。

//__attribute__((always_inline))
inline 
int add_inline(int n);

int main(int argc, char *argv[])
{
    int r = add_inline(10);

    printf(" r = %d\n", r);

    return 0;
}

inline int add_inline(int n)
{
    int ret = 0;

    for(int i=0; i<n; i++)
    {
        ret += i;
    }

    return ret;
}

C++中inline内联编译的限制:
->  不能存在任何形式的循环语句。
->  不能存在过多的条件判断语句。
->  函数体不能过于庞大。
->  不能对函数进行取值操作。
->  函数内联声明必须在调用语句之前。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式_笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值