内联函数(inline)

//问题: 短小的函数(1-10行) ,同时需要频繁的调用(10w次)。
//举例场景:在堆排和快排中,排序10w个数据,里面的swap函数。

//分析:由于需要高频繁性调用,导致需要不断的开辟栈帧,影响程序的运行效率,所以C语言 和 C++都有各自的解决方案:
//C -> 宏函数
//C++ ->inline(内联函数)

1、C语言中的宏函数

1.1 宏(宏常量和宏函数)的优缺点

//优点:a、宏函数提高效率,减少栈帧建立 (直接进行替换)
//缺点:a、可维护性或可读性差(宏函数复杂)  b、没有类型安全检查   c、不方便调式

1.2 宏函数如何写

#define ADD(a,b) ((a)+(b))
int main()
{
 //应用宏函数的几个实例:
//检测宏函数是否写的正确,带入实例看能否进行替换并完成功能(在预处理阶段,完成替换)

	ADD(1,2); // ((1)+(2))

	if (ADD(1,2)) //if(((1)+(2))) [这里就说明最后定义时不能加 ; ,要不就变成了if(((1)+(2));)]
	{

	}

	ADD(1,2) * 3; // ((1)+(2))*3 [这里就体现出外面括号的重要性] { 假如没有外面的括号,就变成:(1)+(2)*3 }

	int x = 1, y = 2;
	ADD(x|y,x&y); //((x|y)+(x&y))[这里就体现出里面括号的重要性] { 加入没有里面的括号,就变成:(x|y + x&y)},进而导致 y+x 先进行计算了。

	return 0;
}

2、C++中的inline(在符合条件的情况下,在调用地方展开)

2.1 内联函数的概念及优势

//内联函数:以inline修饰的函数叫做内联函数,编译时C++编辑器会在 调用内联函数 的地方展开,(优势)使得没有函数压栈的开销,内联函数
//可以提升程序运行的效率。
//内联函数不仅弥补了宏函数的缺点,也具备宏函数的优点 {因此在C++中基本不再建议使用宏函数,而是用inline去替代}

inline int Add(int a,int b)
{
	return a + b;
}

int main()
{
	cout<< Add(1,2) <<endl; //可以调整相应模式在debug版本下用反汇编观察
	return 0;
}

2.2 内联函数的应用条件(特性)

//(1)inline 对于编译器而言只是一个建议,编译器会自动优化;如果定义为:inline的函数代码指令很长(大概十行左右)/存在递归等情况,编译器优化时会忽略掉内联。

//(2)inline是以 空间换时间 的做法,省去调用函数的额外开销。所以在代码指令很长(10行左右)或有递归的函数不适合使用作为内联函数。
//                                (节省时间,提升程序运行效率)       【代码指令很长时,不会展开inline(如果展开,会导致编译出的可执行程序增大多倍)


//   Func函数            调用Func函数1W次
//
//             
//                       不展开inline:1W+100 (1万次call指令 + 100行Func函数指令)
//   100行指令        
//                       展开inline:  1W*100 (1万次调用*每次调用是100行指令)———如果展开,导致编译出的可执行程序变大很多
//

//(3)inline不建议申明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就找不到了。(所以要在 .h 文件中直接定义inline)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值