C++_07_内联函数(inline) - 重写版
内联函数(inline)
在c++语言中可以使用
const int A = 3;
代替 #define A 3; 可以做到变量的替换,但是如果是需要替换更大的函数呢?
C++中使用inline关键字声明内联函数,使用内联函数替代代码片段,达到相似的效果!
注意:
在函数定义时一定要加inline关键字,必须和函数体紧密相联,否则编译器会直接忽略内联请求。定义则没有这个要求,可以不加(先声明,后定义,定义和函数体紧密相联)
C++编译器可以将一个函数进行内联编译,被C++编译器内联编译的函数叫做内联函数
/**
* 内联函数意义:
* 大范围替换代码片段,可以使用内联函数
* 注意:
* 内联函数声明时inline关键字必须和函数定义结合在一起,
* 否则编译器会直接忽略内联请求。(先声明后定义)
*/
#include <iostream>
using namespace std;
void printA(); //内联函数
void printB(); //普通函数
int main()
{
printA(); //内联函数调用,完全宏文本替换,编译器操作
// { 相当于这样
// int a = 200;
// cout<<"a = "<<a<<endl;
// }
//2 C++编译器直接将函数体插入在函数调用的地方
//3 内联函数省去了普通函数调用时压栈,跳转和返回的开销
//4 一次调用看不出来效果,但是多次调用一个函数效果会比较明显
//5 会占用较大代码段空间,但反应速度快啊
printB(); //普通函数调用,每次调用都有压栈、跳转、返回开销
return 0;
}
//inline关键字一定要和函数体紧密联系关联,只需要在定义函数体的时候进行inline申明即可
inline void printA() //内联函数
{
int a = 200;
cout << "a = " << a << endl;
}
void printB() //普通函数
{
int b = 300;
cout << "b = " << b << endl;
}
深入理解:
1、内联函数不需要声明时加inline, 但一定要在定义的时候加inline,inline关键字一定要和函数体紧密联系关联
2、内联函数是纯文本替换,是编译器完成的,和宏定义在预处理的文本替换不一样,这个过程叫内联编译
3、内联函数在最终生成的编译文件中是没有定义和意义的,他只在编写代码到编译代码期间有意义,因为一旦编译,生成的文件都是一样的编码符号;
4、内联函数会增大代码段所占的数量,占用更大的内存资源,内联函数不需要承担函数调用时的压栈、跳转、返回的时间和资源开销(本质而言:用更大资源(主要内存)开销来换取更快的执行效率,等待浪费的时间少了嘛),所以一般短小精悍的函数代码片段建议使用内联
5、内联inline关键字是对编译器采用内联编译的请求,编译器有可能拒绝或忽略,一旦拒绝或忽,内联函数就变成普通函数编译
6、C++比较智能,在某些情况下即便你没加inline关键字采用内联函数,但编译器也会视情况采用内联(优化)编译
7、C++内联函数的限制:不允许存在循环语句,不能存在过多的条件编译语句,适用于逻辑简单且需要多次执行的代码语句,函数体不能态过于庞大,还不能对内联函数进行取址操作
8、内联函数最大的意义就是省去压栈、调用、返回时的开销,当函数体的执行效率远大于压栈、调用、返回时的开销时,内联函数将失去意义
处理一条语句使用内联函数和宏定义替换区别:
1、使用内联函数是将语句封装为函数,宏定义替换不需要函数
2、不涉及运算,只是文本打印的话,两者效果几乎差不多
3、一旦涉及运算,内联函数是做好封装的,运算顺序已经完整规划排序完成,而宏定义替换只是替换文本,没有经历系统完整的运算顺序的规划,有一定的异变性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码