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

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

3天内不再提示

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

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

内联函数是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;
}

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

三、内联函数与宏

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

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

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

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

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

四、总结

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

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

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

审核编辑:汤梓红

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

    关注

    19

    文章

    7493

    浏览量

    87923
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136779
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73639
  • 内联函数
    +关注

    关注

    0

    文章

    10

    浏览量

    2209
  • 函数调用
    +关注

    关注

    0

    文章

    19

    浏览量

    2585

原文标题:C语言内联函数,提升C技巧必备

文章出处:【微信号:混说Linux,微信公众号:混说Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言学习必备资料合集

    C语言学习必备合集主要有如下内容: C函数浏览.chm c
    发表于 08-02 09:54 135次下载

    C++如何处理内联函数

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

    C语言标准库函数

    C语言标准库函数,使用C语言编程时,常用到的函数
    发表于 05-11 16:41 0次下载

    C语言scanf函数详解

    C语言scanf函数详细解释
    发表于 05-15 09:20 6次下载

    基于C语言标准库函数

    基于C语言标准库函数
    发表于 10-23 17:41 11次下载
    基于<b class='flag-5'>C</b><b class='flag-5'>语言</b>标准库<b class='flag-5'>函数</b>

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

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

    C++语言入门教程之C++语言程序设计函数的详细资料概述免费下载

    本文档的主要内容详细介绍的是C++语言入门教程之C++语言程序设计函数的详细资料概述免费下载内容包括了:1
    发表于 09-20 14:51 23次下载

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

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

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

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

    C语言函数速查手册

    c\c++语言函数速查手册
    发表于 06-30 14:48 11次下载

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

    这篇文章介绍C语言内联函数、递归函数函数指针、指针函数
    的头像 发表于 08-14 10:03 1690次阅读

    讲解下C语言内联函数

    内联函数C语言C++中借鉴过来的,适当的使用内联函数
    的头像 发表于 02-16 09:15 1500次阅读

    C语言内联函数

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

    C语言函数参数介绍

    C语言数组元素作函数实参 数组元素可以用作函数实参,不能用作形参。 C语言在用数组元素作
    的头像 发表于 03-10 14:30 2385次阅读

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

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