C C++最全C++从入门到精通——内联函数(1),阿里专家原创

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

a = b;
b = temp;
} while (0)

int main() {
int num1 = 10;
int num2 = 20;

printf("Before swap: num1 = %d, num2 = %d\n", num1, num2);

SWAP(num1, num2);

printf("After swap: num1 = %d, num2 = %d\n", num1, num2);

return 0;

}


这段代码中定义了一个宏 `SWAP`,使用 `do-while` 循环实现交换。在 `main` 函数中声明了两个变量 `num1` 和 `num2`,然后调用 `SWAP` 宏进行交换,最后打印结果。运行程序,输出如下:



Before swap: num1 = 10, num2 = 20
After swap: num1 = 20, num2 = 10


C++中引入了内联函数的概念,主要是为了提高程序的性能。在C语言中没有内联函数的概念,我们通常会使用宏定义来实现,但是宏定义的写法过于困难,如上所示的宏定义实现的交换,所以便在C++中便提出内联函数这个概念,来替代宏定义写的函数。


内联函数的作用是在编译时将函数的代码嵌入调用的地方,而不是通过函数调用的方式执行。


内联函数的优点有以下几点:


1. 减少函数调用的开销:函数调用会涉及到栈的操作、参数传递和返回值的处理等,而内联函数的代码直接嵌入到调用的地方,避免了这些开销。
2. 减少函数调用带来的代码膨胀:函数调用会导致代码中出现大量的跳转指令,而内联函数的代码直接嵌入到调用的地方,可以减少跳转指令的数量,使代码更加紧凑。
3. 提高缓存命中率:内联函数的代码嵌入到调用的地方,可以减少函数调用时的跳转,使得程序的指令更加连续,更有可能被CPU缓存命中,提高程序的执行效率。


需要注意的是,内联函数适用于函数体较小、频繁调用的情况。对于函数体过大或者调用频率较低的函数,使用内联可能会导致代码膨胀、降低缓存命中率,反而影响性能。因此,使用内联函数需要根据具体情况进行权衡和选择。


### 内联函数的概念


以`inline`修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8dbd589273274973b008b64a30720fef.png)  
 如果在上述函数前增加`inline`关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。


## 二、内联函数的查看方式


1. 在`release`模式下,查看编译器生成的汇编代码中是否存在`call Add`
2. 在`debug`模式下,需要对编译器进行设置,否则不会展开(因为`debug`模式下,编译器默认不会对代码进行优化,以下给出`vs2013`的设置方式)


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f3570bcfbf454e8dbf769543673c3b21.png)


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/89cccc608567434fa7bcb65a57d8a567.png)


## 三、内联函数的特性


1. `inline`是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用
	* 缺陷:可能会使目标文件变大
	* 优势:少了调用开销,提高程序运行效率
2. `inline`对于编译器而言只是一个建议,不同编译器关于`inline`实现机制可能不同
	* 一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用`inline`修饰,否则编译器会忽略`inline`特性。
	* 下图为《C++prime》第五版关于`inline`的建议:  
	 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f07b7808d8d34ab9874b7c52ef6144bb.png)
3. `inline`不建议声明和定义分离,分离会导致链接错误。因为`inline`被展开,就没有函数地址了,链接就会找不到。



// F.h
#include
using namespace std;
inline void f(int i);
// F.cpp
#include “F.h”
void f(int i)
{
cout << i << endl;
}
// main.cpp
#include “F.h”
int main()
{
f(10);
return 0;
}
// 链接错误:main.obj : error LNK2019: 无法解析的外部符号 “void __cdecl f(int)” (?f@@YAXH@Z),该符号在函数 _main 中被引用


对于这种情况,我们可以直接在头文件中直接定义



inline void f(int i)
{
cout << i << endl;
}


## 四、关于内联函数的题目


### 宏的优缺点


* 优点:  
 1.增强代码的复用性。  
 2.提高性能。
* 缺点:  
 1.不方便调试宏。(因为预编译阶段进行了替换)  
 2.导致代码可读性差,可维护性差,容易误用。  
 3.没有类型安全的检查 。


### C++有哪些技术替代宏


![img](https://img-blog.csdnimg.cn/img_convert/0f0861623f5a26cae59acc22fdbba63a.png)
![img](https://img-blog.csdnimg.cn/img_convert/1e703002aba5561b97d47ec7b3886e0b.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值