前言

hello,大家好,兵荒马乱的期末考试终于结束了,博主来继续更新博客,欢迎大家继续支持哦。

1.什么是内联函数

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,
内联函数提升程序运行的效率。

2.举例

#include<iostream>
using namespace std;
inline int add(int a, int b)
{
   
	return a + b;
}
inline int sub(int c, int d);
int main()
{
   
	cout<<add(1, 2)<<endl;
	cout << sub(4, 3) << endl;
	return 0;
}
 int sub(int c, int d)
{
   
	return c - d;
}

我们在使用内联函数时必须遵从下列规则之一:
1.函数声明前加关键字inline
2.函数定义前加关键字inline

2.我们为什么需要内联函数

1.常规函数与内联函数的区别

二者的区别在于C++编译器如何将他们组合到程序中。
在程序中,每一条指令都有特定的内存地址,计算机逐步执行指令,有时如遇到分支语句或循环语句时会跳过一些指令,向前或向后跳到指定地址。执行函数调用指令时,程序将在函数调用后,立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码。然后跳到地址被保存指令处。这与读文章看注释再回头读文章类似。这种上蹿下跳的方式,意味着需要一定的开销

内联函数提供了另一种选择,编译器将使用相应的代码替换函数调用,无需上蹿下跳

2.内联函数的代价

内联函数虽然比常规函数快,但相应占用更多的内存。程序在多少个不同的地方调用内联函数,就包含多少个该函数的副本

3.我们可以没有原则的使用内联函数吗?

答案必然是否定的

<mark>频繁调用的小函数可以定义为内联函数</mark>
这样我们一来可以节约时间,二来也不会消耗更多空间。

3.内联函数和宏函数:既生瑜何生亮?

C语言为避免小函数建立栈帧,提供了宏函数,与内联函数很类似,那么我们为什么还要创造内联函数呢?是既生瑜何生亮?还是后浪把前浪拍在沙滩上?
其实啊,就像周瑜有着“年轻气盛,性急易怒”的缺点一样,宏函数也有它的缺点,我们来分析一下:
1.因为宏函数是在预处理阶段展开的,所以不支持调试。
2.宏函数语法与常规函数不同,容易使我等粗心大意之人出错。

3.宏函数没有类型安全检查来把关,用着不放心啊。

4.内联函数的特性

1.能不能都搞成内联?

答案是不能。

我们什么介绍过,频繁调用的小函数适合设为内联函数。但是如果函数中涉及到循环或递归,或者代码很长,牺牲的空间太多了,不适合用内联。

2.设为内联就一定内联吗?

答案也是否定的

我们设为内联与否只是对编译器的一个建议,到底内不内联还是要看编译器自己的想法,编译器会给自己找最轻松的一条路而不是自讨苦吃。当函数中有循环或递归的时候,编译器望而生畏,别别,大哥,您咋能内联呢?小弟承受不住啊。

3.声明和定义分离对函数来说香吗?

你猜,猜对了就是不香。
声明和定义分离会导致链接错误,内联被展开就没有函数地址了,链接时找不到啊。

5.总结

好的,以上就是今天我们要分享的关于内联函数的内容,感谢大家支持,也欢迎大家批评指正。内联是以空间换时间,那么我们最后来分享一首关于“换”的诗吧:

换

那时我以为
很多东西都是可以换的
以悲诗换酒
以石头换春天
以十里山路的泥
换车马行慢
以怒而打碎的灯光
换收拢的明月于窗

可是,我似乎什么也换不来
没有让我酩酊大醉的酒
没有接纳一粒煮熟了的种子的春天
没有车马慢过此生
当然也没有
没有地上扫不去的霜

所有的爱都是无妄之灾
于是所有的换
都明知不来