龙空技术网

你真的了解内联函数吗?

程序员lxiang 71

前言:

而今咱们对“内联函数与普通函数的区别”大概比较重视,同学们都需要了解一些“内联函数与普通函数的区别”的相关资讯。那么小编在网摘上网罗了一些关于“内联函数与普通函数的区别””的相关资讯,希望朋友们能喜欢,小伙伴们快快来学习一下吧!

在 C++ 中,内联函数可以提高函数的执行效率。内联函数是一种特殊的函数,编译器在编译过程中会把这些函数调用展开成对应的函数体,从而减少函数调用的开销,提高代码执行效率。

内联函数的定义通常是在函数声明的前面加上 inline 关键字。例如:

//在函数声明中使用inline关键字inline add(int x,int y);//在函数定义中使用inline关键字inline add(int x,int y){  return x+y;}

于是,我们在main函数中对内联函数进行调用:

int main{        int result = add(5,10);    //这行代码等价于->int result = x+y;      return 0;    }

编译器在编译时会把内联函数的代码直接插入到调用该函数的地方,而不是像正常的函数调用一样,需要先跳转到函数所在的地址执行。

值得注意的是,虽然使用内联函数可以提高函数的执行效率,但不是所有函数都适合使用内联函数。一般来说,内联函数适合用于执行时间比较短的简单函数,例如只有几行代码的函数。对于不适用内联函数的情况有:

函数体比较大:内联函数的主要目的是减小函数调用的开销,当函数体很大时,展开内联函数可能会导致代码膨胀,函数调用的时间开销可忽略不计,反而使程序变得更缓慢。因此,内联函数不适合用于函数体比较大的函数。容易变化的函数:内联函数一旦定义,就像一个宏一样被展开到调用处,这会使得内联函数的修改相当困难。如果一个函数的实现经常变化,内联函数可能会导致代码耦合度增加,不利于代码维护。递归函数:内联函数的实现必须是非递归的,否则编译器无法将递归函数展开成为循环结构。因此,递归函数不适合使用内联函数。带有 static 局部变量的函数:如果一个函数中含有 static 局部变量,那么每次调用该函数时这个局部变量都将得到初始化。如果该函数被声明为内联函数,那么每次调用该函数时都会重新初始化这个局部变量,这将导致函数的性能下降。虚函数:虚函数不能被声明为内联函数,因为虚函数调用需要进行动态绑定(在运行期才确定调用哪个函数),而内联函数的调用在编译期间展开,这样会导致虚函数调用的失效。

过度使用inline会造成程序体积太大,即使拥有虚拟内存,inline造成的代码膨胀也会导致额外的换页行为,降低指令高速缓存装置的命中率,以及伴随而来的效率损失。

记住,inline只是对编译器提出一个申请,不是强制命令。这项申请可以隐式地提出,也可以明确提出,隐式提出是将函数定义于class定义式内:

class student{public:  int age() const      //一个隐式的inline申请    {            return m_age;        }private:  int m_age;};

所以,一个函数是否真的inline,取决于你对编译器,幸运的是大多数编译器提供了一个诊断级别:如果编译器无法将你要求的函数inline化,它会给你发出一个警告信息!

总结:

当我们在决定哪些函数该被声明为inline哪些函数不该时,刚开始 不要任何函数声明为inline,或至少将inline作用范围局限在那些“一定成为inline”,或"十分平淡无奇”的函数身上。慎用inline。这会使以后使用调试器带来帮助,毕竟你如何在一个并不存在的函数内设置断点调试呢!

好了,今天对内联函数的介绍就先到这,我们下期见!

标签: #内联函数与普通函数的区别