历史上的今天
返回首页

历史上的今天

今天是:2025年04月18日(星期五)

正在发生

2019年04月18日 | Keil 函数内联 inline

2019-04-18 来源:eefocus

       内联函数是指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是省去了调用的过程,加快程序运行速度,但是因为把内联函数拷贝了很多份,所以程序大小也变大了。


       当我们在程序里调用函数时,要花时间执行下面几个步骤:

       1. 保护现场,就是先将主调函数里的函数调用返回后要执行的指令的地址压入栈中保存;
       2. 把被调函数的形参和auto存储类型的变量压入栈区保存,这一步压入的所有变量所占有的存储我们称之为被调函数的数据现场;
       3. 执行完被调函数之后,把被调函数数据现场释放(出栈);
       4. 把第1步压入的指令地址出栈,即恢复现场,然后找到这个地址继续执行。

       因此要是程序中一个函数被调用了许多次,那么编译系统需要来来回回的往返许多趟,产生栈内存创建和释放的开销时间,于是C++(C99)的编译系统提供了一个方法。在被调函数的定义前加一个标志(inline)告诉编译系统,编译系统看到这个标志后,实际编译出的可执行程序,就如同用函数体合理地置换了函数被调用处一样,我们称之为内联机制。

    内联函数的工作过程:
    当定义了一个函数之后,编译器会将其编译成一个指令集合。这个指令集合在程序运行的时候会出现在内存的代码区里,并且在调用此函数时程序执行的地址会跳转到这个指令集合的入口地址,当指令集合执行完后,再跳回到主调函数。换句话说,任何时候内存中只有一个指令集,如果该函数被调用10次,则运行时就会跳转到同一入口地址10次。

    如果定义为inline函数,编译器并不创建真实函数,内联函数不仅同普通函数一样经过检查后保存函数名称、参数类型和返回值类型,还会把内联函数的本体也一并存入符号表中,在之后的编译过程中一旦遇到该函数被调用时会首先检查调用是否合法,然后编译器会将inline函数的指令集合(函数代码)复制嵌入到主调函数中的调用位置,内联函数的代码就会直接替换函数调用,这样就不需要函数调用的跳转开销了。如果函数被调用了10次,就相当于内存中就包含10个相同指令集合的拷贝,没有一次调用。

    了解了内联函数是怎么工作的,那么内联机制的优劣就好理解了。需要清楚的是,我们定义为inline函数只是建议编译器进行内联,而不是命令编译器进行内联,所以最后是不是内联函数取决于编译器。还有关键字inline必须与函数定义放在一起才能使函数成为内联(最后由编译器决定),仅放在函数声明前面不起作用。因为inline是在编译时展开,必须有实体,在编译阶段,编译器看到inline标志就会根据该函数体情况去判断是否应该将该函数体定义为内联。

    因此决不决定把函数内联,实际上是空间和时间上的博弈,函数内联是典型的空间换时间的方法。


推荐阅读

史海拾趣

Ampex Data Systems Group公司的发展小趣事

Ampex Data Systems Group 是一家在电子行业中知名的公司,专注于提供数据存储和处理解决方案。以下是关于Ampex Data Systems Group 公司发展的五个相关故事:

  1. 创立与早期发展:Ampex Data Systems Group 公司成立于20世纪50年代,总部位于美国加利福尼亚州的雷迪伍德城。公司最初致力于开发和制造磁带录音机和磁带存储设备,为音频和视频录制领域提供解决方案。在成立初期,Ampex Data Systems Group 通过技术创新和产品质量赢得了客户的信任和市场认可。

  2. 技术创新与产品多样化:随着数据存储和处理技术的发展,Ampex Data Systems Group 不断进行技术创新,扩展产品线。公司推出了一系列新型数据存储和处理设备,包括磁带驱动器、磁盘阵列、数据记录器等。这些产品具有高性能、高可靠性和大容量的特点,适用于航空航天、国防、能源和科学研究等领域。

  3. 政府合同与军事应用:Ampex Data Systems Group 与政府机构和军事部门建立了紧密的合作关系,为其提供定制化的数据存储和处理解决方案。公司参与了许多重要的国防项目,如雷达系统、导航系统、侦察系统等。Ampex Data Systems Group 的产品被广泛应用于军事通信、情报收集和战术分析等领域,为国家安全和国防事业做出了贡献。

  4. 国际市场拓展与合作伙伴关系:除了在美国市场的成功,Ampex Data Systems Group 还积极拓展国际市场,并与全球各种行业领先企业建立了合作伙伴关系。公司在欧洲、亚洲和其他地区设立了销售办事处和合作伙伴网络,扩大了产品的市场份额和影响力。Ampex Data Systems Group 通过与国际合作伙伴的合作,共同推动了技术创新和产品发展。

  5. 持续发展与市场竞争力:Ampex Data Systems Group 持续致力于技术创新和产品研发,以保持在电子行业的竞争力。公司不断投入资金和人力资源,加强研发能力,提升产品性能和品质。同时,Ampex Data Systems Group 还注重市场营销和客户服务,与客户保持密切沟通,满足其需求,并持续改进产品和服务,以适应市场变化和客户需求。

这些故事展示了Ampex Data Systems Group 从成立初期到如今在技术创新、产品多样化、政府合同与军事应用、国际市场拓展与合作伙伴关系以及持续发展与市场竞争力等方面取得的重要进展。

CQR SECURITY公司的发展小趣事

CQR SECURITY公司最初是一家专注于网络安全技术研发的小型创业公司。在创始人的带领下,公司团队攻克了一系列网络安全难题,开发出了具有高度创新性的安全协议。这一技术突破迅速吸引了业界关注,多家大型企业开始与CQR合作,共同推动产品的商业化应用。随着合作的深入,CQR逐渐在电子安全领域建立了自己的地位,最终发展成为一家业内知名的安全解决方案提供商。

Forge Europa Ltd公司的发展小趣事

Forge Europa Ltd公司自成立以来,始终将技术创新视为企业发展的核心驱动力。早期,公司便投入大量资源研发高效能LED灯带技术,成功推出了具有行业领先地位的5050型号LED灯带。这款产品在市场上迅速获得认可,不仅因为其出色的光效和节能性能,更在于其独特的散热设计,有效延长了产品的使用寿命。Forge Europa的这一技术创新不仅为公司赢得了市场份额,也奠定了其在LED灯带领域的领先地位。

Aavid Thermalloy公司的发展小趣事

Forge Europa Ltd公司自成立以来,始终将技术创新视为企业发展的核心驱动力。早期,公司便投入大量资源研发高效能LED灯带技术,成功推出了具有行业领先地位的5050型号LED灯带。这款产品在市场上迅速获得认可,不仅因为其出色的光效和节能性能,更在于其独特的散热设计,有效延长了产品的使用寿命。Forge Europa的这一技术创新不仅为公司赢得了市场份额,也奠定了其在LED灯带领域的领先地位。

Cambridge Electronic Industries Ltd公司的发展小趣事

Cambridge Electronic Industries Ltd(简称CEI)的创立,标志着剑桥地区电子工业的一次重要飞跃。在20世纪中期,随着电子技术的快速发展,CEI的创始人看到了其中的商机,并决定成立一家专注于电子设备和系统研发制造的公司。起初,CEI主要面向当地的小型企业和研究机构,提供定制化的电子解决方案。凭借创始人的技术背景和团队的辛勤努力,CEI逐渐在剑桥地区的电子市场中建立了良好的声誉。

Hitachi (Renesas )公司的发展小趣事

Cambridge Electronic Industries Ltd(简称CEI)的创立,标志着剑桥地区电子工业的一次重要飞跃。在20世纪中期,随着电子技术的快速发展,CEI的创始人看到了其中的商机,并决定成立一家专注于电子设备和系统研发制造的公司。起初,CEI主要面向当地的小型企业和研究机构,提供定制化的电子解决方案。凭借创始人的技术背景和团队的辛勤努力,CEI逐渐在剑桥地区的电子市场中建立了良好的声誉。

问答坊 | AI 解惑

美资公司LSI上海研发中心诚聘 Product Engineer

美资公司LSI上海研发中心诚聘 Product Engineer 内部推荐,有意者请将中英文简历发送至:asic_tapeout@hotmail.com Product Engineer DESCRIPTION OF DUTIES IN ADDITION TO THOSE IN JOB DESCRIPTION: - To support prototype and production r ...…

查看全部问答>

关于usb device时vbus是否必须连接

在设计一个9b92的板子,请问之前有人用过别的型号的usb 接口的功能么. 但作为usb device用时,是否一定要把vbus上拉。 我的板不从usb去电,是否可以通过软件在上电后启动usb口进行枚举? 因为我想省下vbus那个脚做io :-),LM的脚的复用的也太 ...…

查看全部问答>

那里可以下到魅族M8和宇龙酷派N90手机的原理图啊?想知道他们用的什么手机基带芯片,他们的GSM协议栈怎么实现的。

那里可以下到魅族M8和宇龙酷派N90手机的原理图啊?想知道他们用的什么手机基带芯片,他们的GSM协议栈怎么实现的。…

查看全部问答>

关于SD卡驱动

在SD卡驱动程序中有这样一个定义:WCHAR *szRegKey_SDMMC = L\"Drivers\\\\SDCARD\\\\ClientDrivers\\\\Class\\\\SDMemory_Class\"; 在中断线程中,通过这条语句调用szRegKey_SDMMC: hDevice = ActivateDeviceEx(szRegKey_SDMMC, NULL, 0, NULL); ...…

查看全部问答>

西门子300和触摸屏问题

锅炉房的plc300系列有个触摸屏,现在出现个现象,有三个高压泵,2#一直运行中,1#3#备用,现在启动1#泵触摸屏会显示气压极高,导致锅炉停炉,但是起3#就没这种现象,高手们都来分析下,存在干扰?…

查看全部问答>

不好意思顶了老帖子,我对UART超时的用法。

我在CC2430上实现了MODBUS,在CC1110上实现了UART透传。 UART应用程序中超时,串口中断的时候数据往环形队列里面放,队列就是一个组数,有两个标记表示头和尾,这个方法我也是模仿一些国外开发系统中集成的程序。 主程序中用getch函数,读队 ...…

查看全部问答>

DSP C程序中用goto语句妥不妥呢?

我现在写的程序中想用goto语句来解决它(这样做的话,可读性很强,而且也非常容易解决),但是记得原来看过一些C语言的书说不推荐用goto语句,我现在应该怎么选择呢?goto语句对流水线的破坏到底有多大呢?…

查看全部问答>

论坛有群吗?

如题。T3论坛有群吗~~作为一个爱好者。希望和大家一起讨论交流。一起学习,共同进步~~…

查看全部问答>

速度性能的应用示例方案——传统的GPIB配置与经过优化的开关-源表配置

吉时利707B型开关主机和2636A型源表的优化配置时获得的速度性能的应用实例方案,有如下2个介绍: 方案1:传统的GPIB配置 此配置如图1所示。与黄色阴影部分的任务相关的时间进行了吞吐能力对比。蓝色阴影部分的执行任务的时间未进行吞吐能力对比 ...…

查看全部问答>