0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

讲解下C语言的内联函数

jf_BxU6dNQb 来源:混说Linux 2023-02-16 09:15 次阅读

内联函数是C语言C++中借鉴过来的,适当的使用内联函数可以提高程序的执行效率。本篇文章就来讲解下内联函数,赶紧来看下吧!

一、函数调用

在讲内联函数之前,我们需要先了解函数调用,而函数调用,又不得不说函数调用的开销。

一个函数执行的时候,经常会调用另一个函数,比如执行函数A时,我们需要对一些数据进行处理,将运算结果暂存在R0寄存器,接着要调用另一个函数B,而函数B也用到了R0这个寄存器(用于保存函数的返回值),原本函数A暂存在R0寄存器的值就被改变了,这样做肯定不行。

现代计算机系统的做法都是会在执行函数B之前,先把R0寄存器的值保存到堆栈中,函数B执行结束后,再将堆栈中的值恢复到R0寄存器中,然后函数A继续执行,这样对于数据处理就不会有任何问题了。

但是,函数调用却消耗一定的时间进行切换,这段时间用来保存现场和恢复现场,大约相当于一两条语句的执行时间,这就是函数调用带来的开销。

4be2bc7c-ad47-11ed-bfe3-dac502259ad0.png

假如函数B很小,只有一两行代码,从上图我们可以看出,真正只有函数B执行代码的那段时间是对我们有用的,切换带来的就是额外的成本开销了,如果函数A里面多次调用函数B,那开销就更明显了。

4c06926e-ad47-11ed-bfe3-dac502259ad0.png

二、内联函数

函数B很小,又被频繁的调用,可能函数调用的切换时间比函数内代码的执行时间还长,这样明显划不来,那么我们就可以将这个函数声明为内联(加上 inline),编译器在编译时,会把内联函数的实现替换到每个调用内联函数的地方(可以与宏函数做类比),在调用处将代码展开,相当于自动将函数B的代码在调用它的地方复制了一份副本,没有了保护现场和恢复现场的时间,从而节省了函数调用的开销。

4c22152a-ad47-11ed-bfe3-dac502259ad0.png

内联函数一般要求如下:

1. 函数体积小,通常5行以内;

2. 被频繁调用;

3. 函数内无复杂的实现,比如:while、for循环,switch,递归等;

4. 函数没有包含静态变量。

来看一个简单的内联函数的例子:

#include

//将函数max_value声明为inline
inlineintmax_value(intx,inty)
{
return(x>y)?x:y;
}

intmain()
{
inta=1,b=2;
intm;
m=max_value(a,b);

return0;
}
main函数代码在执行的时候是这样的:
intmain()
{
inta=1,b=2;
intm;
m=(1>2)?1:2;

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

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

#include
usingnamespacestd;

classHunTalk_Linux
{
public:
//默认是内联函数
intmax_value(intx,inty)
{
return(x>y)?x:y;
}
};

intmain()
{
return0;
}

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

三、内联函数与宏

前面讲到可以与宏函数做类比,那么就纳闷了,为什么不直接定义一个宏,而是定义一个内联函数?存在即合理,自然有它存在的道理,相对于宏,内联函数提供了更好的方法:

参数类型检查。编译过程中,宏调用并不执行类型检查,甚至连正常参数也不检查,内联函数虽然具有宏的展开特性,但其本质仍是函数,编译器仍可以对其进行参数检查,而宏就不具备这个功能。

在宏中的编译错误很难发现,因为它们引用的是扩展的代码,而不是程序员键入的。

便于调试。内联函数代码的调试信息通常比扩展的宏代码更有用,它同样可以支持断点、单步......等调试功能。

接口封装。有些内联函数可以用来封装一个接口,而宏不具备这个特性。

四、总结

引入内联函数主要是解决一些频繁调用的小函数造成额外时间开销的问题,但是也要在符合一定内联函数的情况下使用。

使用很多的内联函数,每个调用该函数的地方都需要替换成函数体,代码量就会增加,代码量就会增加也同时带来了潜在的编译时间的增加。

算法里面有个概念叫空间换时间,就是使用内存占用更大的算法换取执行速度的提升,所以说适当的使用内联函数可以提高程序的执行效率。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5037

    浏览量

    117765
  • C语言
    +关注

    关注

    180

    文章

    7534

    浏览量

    128852
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48628
  • C++语言
    +关注

    关注

    0

    文章

    146

    浏览量

    6878
收藏 人收藏

    评论

    相关推荐

    C++标准编程:虚函数内联

      曾经在讨论C++的时候,经常会问到:“虚函数能被声明为内联吗?”现在,我们几乎听不到这个问题了。现在听到的是:“你不应该使print成为内联的。声明一个虚
    发表于 05-03 11:53

    内联函数简介

    1.内联函数C++中我们通常定义以下函数来求两个整数的最大值:复制代码 代码如下:int max(int a, int b){return a > b ? a : b;}为这么一个小
    发表于 09-11 16:22

    如何使用内联函数法调用汇编函数

    C/C++中调用汇编代码中的函数使用内联函数法调用汇编函数
    发表于 04-02 06:57

    基于SUIF的函数内联技术

    从基于调用图的函数内联技术、函数参数的映射技术和内联使用的不同策略3 个方面讨论基于SUIF 系统的内联技术的实现。根据KAP 系统需求,提
    发表于 03-28 09:50 6次下载

    C++如何处理内联函数

    当一个函数内联和虚函数时,会发生代码替换或使用虚表调用吗? 为了弄 清楚内联和虚函数,让我们将它们分开来考虑。通常,一个
    发表于 11-29 11:59 28次下载

    内联函数详解

    什么是内联性和外联函数 类的成员函数可以分为内联函数和外联函数
    发表于 11-02 14:05 0次下载

    内联函数和外联函数有什么区别

    内联函数是指用inline关键字修饰的函数。在类内定义的函数被默认成内联函数
    发表于 12-15 11:52 5485次阅读
    <b class='flag-5'>内联</b><b class='flag-5'>函数</b>和外联<b class='flag-5'>函数</b>有什么区别

    内联函数的主要作用是什么_内联函数在C语言中的作用

    内联函数是一种编译机制,优点从代码上是看不出来的,但是程序的执行效率上有差别,通常,编译器对函数调用的处理是一种类似中断的方式,即当执行到函数调用语句时,程序把当前所有的状态信息比如C
    发表于 12-15 14:27 1.6w次阅读
    <b class='flag-5'>内联</b><b class='flag-5'>函数</b>的主要作用是什么_<b class='flag-5'>内联</b><b class='flag-5'>函数</b>在C<b class='flag-5'>语言</b>中的作用

    Java之内联函数_内联函数的优缺点

    内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度。Java
    发表于 12-15 15:00 3107次阅读

    C++基础语法之inline 内联函数

    上节我们分析了C++基础语法的const,static以及 this 指针,那么这节内容我们来看一下 inline 内联函数吧! inline 内联函数 特征 相当于把
    的头像 发表于 09-09 09:38 1857次阅读

    C++语法中的inline内联函数详解

    上节我们分析了C++基础语法的const,static以及 this 指针,那么这节内容我们来看一下 inline 内联函数吧! inline 内联函数 特征 相当于把
    的头像 发表于 09-09 09:33 3186次阅读

    C语言-内联函数、递归函数、指针函数

    这篇文章介绍C语言内联函数、递归函数函数指针、指针函数、局部地址、const关键字、exte
    的头像 发表于 08-14 10:03 1377次阅读

    C语言内联函数,提升C技巧必备

    内联函数是C语言从C++中借鉴过来的,适当的使用内联函数可以提高程序的执行效率。本篇文章就来讲解下
    的头像 发表于 02-16 09:16 578次阅读

    C语言内联函数

    函数B很小,又被频繁的调用,可能函数调用的切换时间比函数内代码的执行时间还长,这样明显划不来,那么我们就可以将这个函数声明为内联(加上 in
    的头像 发表于 02-21 16:55 627次阅读
    C<b class='flag-5'>语言</b><b class='flag-5'>内联</b><b class='flag-5'>函数</b>

    宏的缺陷与内联函数的引入

    。 所以为了解决这种不利于调试的问题,就有了内联函数。 那么什么是内联函数呢? 我们以inline修饰的函数叫做
    的头像 发表于 11-01 17:57 233次阅读