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

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

3天内不再提示

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

麦辣鸡腿堡 来源:轩哥谈芯 作者:轩哥谈芯 2023-11-01 17:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

宏虽然有着一定的优势,但是它的缺点也不可忽视。

在编译阶段,我们很难发现代码哪里出问题了,因为宏替换是发生在预处理阶段,所以有时候在宏函数传参的时候发生一些错误,编译器不会发现,那它调试起来就很麻烦。

所以为了解决这种不利于调试的问题,就有了内联函数。

那么什么是内联函数呢?

我们以inline修饰的函数叫做内联函数,编译阶段,C编译器会在调用函数的地方直接把函数展开,没有压栈开销,内联函数提升程序运行效率,但是会相应的增加代码的长度。所以这里叫做空间换时间。

道之初,带来了空间和时间,所以,空间和时间就是编程的阴阳两级。

不懂编程之道的程序员常常把空间和时间消耗殆尽,得道的程序员则总是有足够的空间和时间完成编程任务。

举个例子

inline int Add(int a,int b){ return a+b;}

编译期间,编译器会将内联函数替换相应的函数体;

这里要注意一点,在函数前加 inline 只是建议编译器当作内容函数处理 ,但编译器有自己的主张(递归 ,复杂函数等)

内联函数的特性:

inline是一种以空间换时间的做法,省去调用函数中参数压栈,减少了调用的开销。同时,使用内联函数也比宏函数更省心,不必担心宏参数传递过程中出现的意外情况。

inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联,另外,如果内联函数的函数体过大,一般的编译器也会放弃内联方式,采用普通调用的方式进行函数调用。

inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

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

    关注

    3

    文章

    4406

    浏览量

    66858
  • 代码
    +关注

    关注

    30

    文章

    4942

    浏览量

    73160
  • 编译器
    +关注

    关注

    1

    文章

    1670

    浏览量

    51087
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言的编程技巧

    1、定义使用do{...}while(0)‌:当定义中包含多条语句时,使用do{...}while(0)可以避免语句嵌套问题,确保的独立性。‌ ‌2、灵活数组成员‌:C99标准允许结构体的最后
    发表于 11-27 06:46

    控制流和函数调用的精细调整

    特性,避免不必要的计算。 函数调用涉及开销,因为它需要保存当前执行环境并跳转到新的执行环境。减少函数调用,尤其是在频繁执行的循环中,可以显著提高性能。 对于简单且频繁调用的函数,使用内联
    发表于 11-14 06:32

    inline ASM(内联汇编)的细节分享

    内联汇编 基本的语法 asm volatile (\"instruction list\":OUTPUT:INPUT:(clobber/modify)); 如果
    发表于 10-31 09:11

    内联汇编的妙用

    它数据相关,于是借助循环变量i,做累加操作,但结果还是不对。 3、内联汇编(结果正确) 一觉醒来,突然想到内联汇编,决定一试:既然编译器不能如我所愿,那可以把想要的部分先自己编译。各种架构在线编译
    发表于 10-31 06:28

    简单的内联汇编介绍

    ,只能采用内嵌汇编指令(CSR指令)的方式,才能对 CSR 寄存器进行操作。 内联汇编程序 内敛汇编函数格式: asm volatile ( 汇编指令列表 : 输出操作数 // 非必需 : 输入操作数
    发表于 10-30 08:04

    RISC-V的工具链GCC内联汇编

    GCC内联汇编语法规则如下: asmvolatile( 汇编指令列表 :输出操作数 :输入操作数 :可能影响的寄存器或存储器); 以下分别详细介绍: 1.关键词“asm”是GCC的关键词,表示进行内联
    发表于 10-30 06:59

    计算程序执行指令数的函数实现

    __RV_CSR_READ是一个定义,采用内联汇编使用csrr指令 也可查看反汇编代码: 4、查手册可知,csrr指令是用来读CSR寄存器的值 5、而minstreth和minstret寄存器介绍如下
    发表于 10-28 06:27

    GCC内联汇编

    GCC内联汇编 在蜂鸟内核的NICE协处理器扩展demo的insn.h文件中存在下面一段指令,用于定义对协处理器调用指令,demo中协处理器支持三条指令:lbuf从内存中load数据至行数据缓存
    发表于 10-24 07:46

    通过内联汇编调用乘法指令mulh\\mulhsu\\mulhu

    mulh、mulhu与mulhsu指令,不能直接验证,需要其他方法。因此,我们想到了在C语言中嵌入内联汇编,分别生成三条指令的接口函数,之后便只需在C语言中调用者三中函数便可执行mulh、mulhu
    发表于 10-24 06:52

    C语言中的内联函数

    在C编程中,内联函数都用于避免函数调用的开销并编写可复用的逻辑部分,但它们在工作方式和安全性方面存在显著差异。
    的头像 发表于 07-25 15:10 1724次阅读
    C语言中的<b class='flag-5'>内联</b><b class='flag-5'>函数</b>与<b class='flag-5'>宏</b>

    MSP430常用内联函数说明

    电子发烧友网站提供《MSP430常用内联函数说明.docx》资料免费下载
    发表于 06-05 17:20 0次下载

    Vicor助力发打造主动悬架电源系统

    厦门发电声股份有限公司(发)打造业内性能卓越的主动悬架电源系统,旨在将长期以来仅见于豪华车型的功能引入中端车型。发成功突破困扰知名汽车技术供应商几十年的技术瓶颈,在满足主动悬架系
    的头像 发表于 06-04 15:24 926次阅读

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数引入

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数引入
    的头像 发表于 05-29 14:05 846次阅读
    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API<b class='flag-5'>函数</b>的<b class='flag-5'>引入</b>

    芯片离子注入后退火会引入的工艺问题

    本文简单介绍了芯片离子注入后退火会引入的工艺问题:射程末端(EOR)缺陷、硼离子注入退火问题和磷离子注入退火问题。
    的头像 发表于 04-23 10:54 1460次阅读
    芯片离子注入后退火会<b class='flag-5'>引入</b>的工艺问题

    EE-32:语言扩展:内存存储类型、ASM和内联构造

    电子发烧友网站提供《EE-32:语言扩展:内存存储类型、ASM和内联构造.pdf》资料免费下载
    发表于 01-14 15:03 0次下载
    EE-32:语言扩展:内存存储类型、ASM和<b class='flag-5'>内联</b>构造