C++内联函数
1、什么是内联函数
内联函数是C++的增强特性之一,用来降低程序的运行时间。当内联函数收到编译器的指示时,即可发生内联:编译器将使用函数的定义体来替代函数调用语句,这种替代行为发生在编译阶段而非程序运行阶段。
值得注意的是,内联函数仅仅是对编译器的内联建议,编译器是否觉得采取你的建议取决于函数是否符合内联的有利条件。如何函数体非常大,那么编译器将忽略函数的内联声明,而将内联函数作为普通函数处理。
2、为什么使用内联函数
定义函数的时候,在函数的最前面以关键字“inline”声明函数,即可使函数称为内联声明函数
#include <iostream>
#include<math.h>
using namespace std;
inline int root(int n)
{
return (int)sqrt((float)n);
}
bool prime(int n )
{
int i ;
for(i = 2;i<=root(n);i++)
{
if(n%i==0)
return false;
}
return true;
}
int main()
{
int n =11;
string result;
result = prime(n)?"true":"false";
cout<<result<<endl;
return 0;
}
例如上面的代码中,我们要判断一个数是否是素数;for循环的结束条件每一次都是去调用root函数开平方。调用函数,就需要拷贝,传参,压栈出栈,效率很低。
通过inline声明,编译器在编译的时候首先在调用出使用函数体本身的语句替换掉函数调用语句,然后进行编译。这样就不需要进行函数跳转,效率会高一些。
3、内联函数优缺点分析
3.1、优点:
3.1.1、可以通过替换代码避免函数调用带来的开销,提高程序运行的效率(压栈出栈,返回数据等的开销)
3.1.2、通过将函数声明为内联,你可以把函数定义放在头文件内 。
3.2、缺点:
3.2.1、因为代码的扩展,内联函数增大了可执行程序的体积 。
3.2.2、C++内联函数的展开是中编译阶段,这就意味着如果你的内联函数发生了改动,那么就需要重新编译代码。 (尤其是比较大的项目,稍微动一下,需要编译很久)
3.2.3、当你把内联函数放在头文件中时,它将会使你的头文件信息变多,不过头文件的使用者不用在意这些。
3.2.4、有时候内联函数并不受到青睐,比如在嵌入式系统中,嵌入式系统的存储约束可能不允许体积很大的可执行程序。
4、何时使用内联函数
当程序设计需要时,每个函数都可以声明为inline。下面列举一些有用的建议:
1、当对程序执行性能有要求时,那么就使用内联函数吧。
2、当你想宏定义一个函数时,那就果断使用内联函数吧。
3、在类内部定义的函数会默认声明为inline函数,这有利于 类实现细节的隐藏。
5、关键点
1、内联声明只是一种对编译器的建议,编译器是否采用内联措施由编译器自己来决定。甚至在汇编阶段或链接阶段,一些没有inline声明的函数编译器也会将它内联展开。
2、编译器的内联看起来就像是代码的复制与粘贴,这与预处理宏是很不同的:宏是强制的内联展开,可能将会污染所有的命名空间与代码,将为程序的调试带来困难。
3、所有的类中定义的函数都默认声明为inline函数,所有我们不用显示地去声明inline。
4、虚函数不允许内联。
5、虽然说模板函数放中头文件中,但它们不一定是内联的。(不是说定义在头文件中的函数都是内联函数)。