一文搞懂内联函数!

举报
Linux猿 发表于 2021/08/29 18:09:06 2021/08/29
1.9k+ 0 0
【摘要】 Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 作者:Linux猿

🎈 简介:Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!


内联函数想必大家都很熟悉,适当的使用内联函数可以提高程序的执行效率。本篇文章就来讲解下内联函数,赶紧来看下吧!

一、什么是内联函数?

内联函数是在 C++ 中增加的一个功能,可以提高程序执行效率。如果函数是内联的,编译器在编译时,会把内联函数的实现替换到每个调用内联函数的地方,可以与宏函数作类比,但宏函数不会进行类型检查。

可以将普通函数或者类的成员函数声明为内联。

内联函数一般要求如下:

1. 函数简短,通常3-5行;

2. 函数内没有复杂的实现,比如:包含while、for 循环,递归等;

3. 通常在多处有调用;

注意:函数声明为内联,仅仅是对编译器的建议,如果函数比较复杂,编译器会将其看做普通函数。

来看一个简单的例子,如下所示:

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

输出结果为:

linuxy@linuxy:~/inlineFunction$ ./main 
5 + 8 = 13
10 + 20 = 30
linuxy@linuxy:~/inlineFunction$

在代码执行的时候是这样的:

int main() {
 
    cout<<"5 + 8 = "<<5 + 8<<endl;
    cout<<"10 + 20 = "<<10 + 20<<endl;
    return 0;
}

内联函数在调用处展开了。

再来看一个类的内联函数,如下所示:

#include <iostream>
using namespace std;
 
class Node {
public:
    int Add(int x, int y);
};
 
inline int Add(int x, int y) {
   return x + y;
}
 
int main() {
 
    return 0;
}

注意:定义在类中的函数,默认情况下都是内联的,比如下面这种情况。

#include <iostream>
using namespace std;
 
class Node {
public:
    int Add(int x, int y) {//默认是内联函数
        return x + y;
    }
};
 
int main() {
 
    return 0;
}

但是,如果函数很复杂,编译器会将其作为普通函数来处理。

二、为什么要使用内联函数 ?

引入内联函数主要是解决一些频繁调用的小函数消耗大量空间的问题。

通常情况下,在调用函数时,程序会将控制权从调用程序处转移到被调用函数处,在这个过程中,传递参数、寄存器操作、返回值等会消耗额外的时间和内存,如果调用的函数代码量很少,也许转移到调用函数的时间比函数执行的时间更长。而如果使用内联函数,内联函数会在调用处将代码展开,从而节省了调用函数的开销。

三、哪些函数不能是内联函数?

1. 递归调用本身的函数;

2. 包含复杂语句的函数,例如:for、while、switch 等;

3. 函数包含静态变量;

四、使用内联函数的缺点

1. 如果使用很多内联函数,生成的二进制文件会变大;

2. 编译的时间会增加,因为每次内联函数有修改,就需要重新编译代码。

所以,并不是所有函数都要声明为内联函数,需要视具体情况而定。

五、总结

内联函数能够减少函数调用的开销,但是,应该在符合一定内联函数的情况下使用。


🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。