【C++】内联函数inline

文章目录


概念

C++中内联函数的出现解决了C语言宏函数的不足,类似于宏展开,这种在函数调用处直接嵌入函数体的函数称为内联函数,又称内嵌函数或内置函数。

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

使用

在函数的返回值前加上inline关键字即可。

#include<iostream>
using namespace std;
inline int Add(int x, int y)
{
    
    
	return x + y;
}
int main()
{
    
    
	int ret = Add(10,20);
	cout<<ret<<endl;

	return 0;
}

如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。

特性

1)短小的,频繁调用的函数才适合声明为内联函数。要知道inline对于编译器而言只是一个建议,不是强制性的,编译器有自己的判断能力。

2)为什么函数体长了之后,内联函数不展开?

如果函数体代码比较长,如递归等,使用内联函数会导致代码膨胀。会导致编译后的程序存在多份相同的拷贝,编译出来的可执行程序也会非常大,会消耗更多的内存空间,如果指向函数体代码的时间比函数调用的开销大的多,那么inline效率收益会很小

3)所以inline是一种空间换时间的做法(空间:由于函数体代码展开,编译出来的可执行程序大小/静态库,动态库/会变大)

4)综上,内联函数的缺点:可能会使目标文件变大;优点:少了调用开销,提高程序运行效率

5)inline内联函数不建议声明和定义分离
在这里插入图片描述
在这里插入图片描述
错误定义:声明和定义分离如下:
在这里插入图片描述

解决方法:直接在头文件中定义内联函数

在这里插入图片描述

原理

我们通过查看程序代码的反汇编语言,来了解一下inline函数的执行原理:

查看方式:

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

先右击项目,点击项目属性。
在这里插入图片描述
我们先来看一段普通函数f的调用过程(通过查看debug下的汇编代码):
在这里插入图片描述
内联函数的原理即底层调用方式:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_63449996/article/details/129740566