【C++ 记忆站】内联函数

在这里插入图片描述

文章目录

  • 一、概念
  • 二、特性
      • 1、inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段,会用函数体替换函数调用
      • 2、inline对于编译器而言只是一个建议若一个函数代码很长则编译器不会将它变成内联
      • 3、一般来说,函数代码在10行及以内时这时编译器会将它优化为内联函数有些编译器是在30行以内
      • 4、内联函数的定义和声明不能分开因为inline被展开后就没有函数地址了,链接时会找不到

【C++ 记忆站】内联函数_第1张图片

一、概念

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

【C++ 记忆站】内联函数_第2张图片

在这样一场景里,堆排和快排排序10w或更多的数据,里面swap函数会被调用很多次,没调用一次都会单独创建一个栈帧,这样空间开销就会很大,严重影响程序运行的效率

C语言解决这个问题只有通过宏

但是宏的缺点有很多,总共有以下几点:

1.可读性差
2.没有类型安全检查
3.不方便调试

同时也有几个优点

1.可维护性高:比如一个宏参数在一段很长的代码中会用到很多次,修改这个参数只需要修改一次定义宏参数这个位置的参数就行了
2.提高效率:减少了栈帧的建立

比如一个ADD宏函数

#define ADD(x,y)((x)+(y))

你需要考虑符号的优先级,就需要通过很多括号让每个变量进行隔开,虽然ADD宏函数这样看起来不是很复杂,但是万一要创建一个变量每次多的函数,其中的关系必须处理得非常准确,不能发生问题,就看起来每次乱和复杂了,而且一个宏函数需要满足几个场景都能实现才能保障程序不会出错

int main()
{
	int a = 0;
	int b = 1;
	cout << ADD(a, b) << endl;

	if (ADD(a, b))
	{

	}

	ADD(a, b) * 3;
	ADD(a | b, a & b);

	cout << ADD(a | b, a & b) << endl;
	return 0;
}

所以C++针对这个问题就提出了内联函数

二、特性

1、inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段,会用函数体替换函数调用

2、inline对于编译器而言只是一个建议若一个函数代码很长则编译器不会将它变成内联

3、一般来说,函数代码在10行及以内时这时编译器会将它优化为内联函数有些编译器是在30行以内

4、内联函数的定义和声明不能分开因为inline被展开后就没有函数地址了,链接时会找不到

你可能感兴趣的:(C++,记忆站,c++,开发语言)