C++排雷:26.inline内联函数和宏定义的区别

引例:

#include <iostream>
using namespace std;





//带参数的宏
#define MYFUNC(a, b) ((a) < (b) ? (a) : (b))  

inline int myfunc(int a, int b)
//inline int myfunc(int a, int b)和函数体的实现,写在一块
	//2 C++编译器直接将函数体插入在函数调用的地方
	//3 内联函数省去了普通函数调用时压栈,跳转和返回的开销 
{
	return a < b ? a : b;
}


int main()
{
	int a = 1;
	int b = 3;
	
	//int c = myfunc(++a, b);  // a=2 b=3 c=2
	

int c = MYFUNC(++a, b); //==>宏替换并展开 ((++a) < (b) ? (++a) : (b))  //a=3 b=3 c=3


	printf("a = %d\n", a); 
	printf("b = %d\n", b);
	printf("c = %d\n", c);

	system("pause");
	return 0;
}

共同点:

使用宏和内联函数都可以节省在函数调用方面所带来的时间和空间开销。二者都采用了空间换时间的方式,在其调用处进行展开;

内联函数和带参数的宏定义实现的功能是一样的。

区别:

(1) 在预编译时期,宏定义在调用处执行字符串的原样替换(宏展开)。在编译时期,内联函数在调用处展开,同时进行参数类型检查,宏定义不会进行参数类型检查

(2) 内联函数首先是函数,可以像调用普通函数一样调用内联函数。而宏定义往往需要添加很多括号防止歧义,编写更加复杂
(3) 内联函数可以作为某个类的成员函数,这样可以使用类的保护成员和私有成员**。而当一个表达式涉及到类保护成员或私有成员时,宏就不能实现了(无法将this指针放在合适位置)**。

可以用内联函数完全替代宏。

在编写内联函数时,函数体应该短小而简洁,不应该包含循环等较复杂结构,否则编译器不会将其当作内联函数看待,而是把它决议成为一个静态函数。

有些编译器甚至会优化内联函数,通常为避免一些不必要拷贝和构造,提高工作效率。

频繁的调用内联函数和宏定义容易造成代码膨胀,消耗更大的内存而造成过多的换页操作。

参考:
https://blog.csdn.net/qq_28584889/article/details/88691959?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.2101.3001.4242

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值