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

    文章

    4331

    浏览量

    62593
  • 代码
    +关注

    关注

    30

    文章

    4787

    浏览量

    68589
  • 编译器
    +关注

    关注

    1

    文章

    1634

    浏览量

    49128
收藏 人收藏

    评论

    相关推荐

    A/B型缺陷和D/V类缺陷介绍

    在直拉法(cz)和区熔法(Fz)制成的单晶硅锭中内生微缺陷都由V/G控制,其中,V是结晶前沿晶体生长速率,G是晶体中固液界面附近的轴向温度梯度。 如果V/G低于临界值,则形成的缺陷为A型漩涡缺陷或B
    的头像 发表于 11-14 16:41 246次阅读
    A/B型<b class='flag-5'>缺陷</b>和D/V类<b class='flag-5'>缺陷</b>介绍

    SUMIF函数与SUMIFS函数的区别

    SUMIF函数和SUMIFS函数都是Excel中用于条件求和的函数,它们可以帮助用户根据特定的条件对数据进行求和。尽管它们的基本功能相似,但在使用场景和功能上存在一些差异。以下是对这两个函数
    的头像 发表于 10-30 09:51 1063次阅读

    TC387中有__disable_interrupts()关闭所有中断和打开所有中断的函数吗?

    TC387 芯片中有__disable_irq()和__enable_irq()关闭所有中断和打开所有中断的函数吗,请告知
    发表于 08-01 08:22

    BP神经网络激活函数怎么选择

    中,激活函数起着至关重要的作用,它决定了神经元的输出方式,进而影响整个网络的性能。 一、激活函数的作用 激活函数是BP神经网络中神经元的核心组成部分,其主要作用如下: 引入非线性:激活
    的头像 发表于 07-03 10:02 689次阅读

    卷积神经网络激活函数的作用

    起着至关重要的作用,它们可以增加网络的非线性,提高网络的表达能力,使网络能够学习到更加复杂的特征。本文将详细介绍卷积神经网络中激活函数的作用、常见激活函数及其特点,以及激活函数在网络优化中的应用。 一、激活
    的头像 发表于 07-03 09:18 898次阅读

    神经网络中的激活函数有哪些

    在神经网络中,激活函数是一个至关重要的组成部分,它决定了神经元对于输入信号的反应方式,为神经网络引入了非线性因素,使得网络能够学习和处理复杂的模式。本文将详细介绍神经网络中常用的激活函数,包括其定义、特点、数学形式以及在神经网络
    的头像 发表于 07-01 11:52 589次阅读

    如何在idf工程中引入mdf WiFi-Mesh函数

    我原先在idf下开发好的程序,如何引入mdf进行开发?需要用到WiFi-Mesh,看了下mdf下的例程是比较合适的,而idf下的wifi-mesh例程很粗略,想把mdf中的例程移植到我原来的idf工程里面去
    发表于 06-28 14:59

    inline关键字被优化导致此类函数被布局在flash内,怎么处理?

    == 0));} 由于uart.c多处调用这个函数,所以编译器自作聪明地把它编译成了非内联函数(意图是减少代码占用?),且elf能找到uart_ll_is_tx_idle标号
    发表于 06-21 12:03

    IDF4.2.1的编译器优化bug导致panic怎么处理?

    == 0) && (status.st_utx_out == 0));} 它是一个inline函数。我们都认为inline关键字,会告诉编译器内联函数,于是它的代码
    发表于 06-21 10:55

    请问STM32硬件I2C存在什么缺陷

    我看野火的库函数开发手册里面感觉用I2C用的挺顺的呀 为什么张洋却说STM32的I2C有缺陷 不推荐用 请问下 各位在使用I2C的时候碰到过什么情况吗 我怎么都没感觉到I2C的缺陷 能否说下这个
    发表于 05-16 07:46

    集PLC如何应用于建筑的3D打印?

    集MC Pi-Prime模块化PLC采用EtherCat作为通信协议,有助于实现快速的反应时间和精确的定位控制,为自动化工程师提供灵活的扩展与集成,并缩短实施时间,助力建筑行业引入3D打印。
    的头像 发表于 03-22 10:46 338次阅读
    <b class='flag-5'>宏</b>集PLC如何应用于建筑的3D打印?

    函数指针与回调函数的应用实例

    通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数函数指针可以像一般函数一样,用于调用函数、传递参数。
    的头像 发表于 03-07 11:13 400次阅读
    <b class='flag-5'>函数</b>指针与回调<b class='flag-5'>函数</b>的应用实例

    嵌入式Linux C语言编程程序调试与定义

    在Linux使用gcc编译程序的时候,对于调试的语句还具有一些特殊的语法。gcc编译的过程中,会生成一些,可以使用这些分别打印当前源文件的信息,主要内容是当前的文件、当前运行的函数和当前的程序行。
    发表于 03-01 11:41 1010次阅读

    内联函数定义 为什么需要内联函数

    inline关键字是C99标准的型关键字,其作用是将函数展开,把函数的代码复制到每一个调用处。
    的头像 发表于 02-19 12:20 542次阅读

    如何用Rust过程魔法简化SQL函数呢?

    这是 RisingWave 中一个 SQL 函数的实现。只需短短几行代码,通过在 Rust 函数上加一行过程,我们就把它包装成了一个 SQL 函数
    的头像 发表于 01-23 09:43 951次阅读
    如何用Rust过程<b class='flag-5'>宏</b>魔法简化SQL<b class='flag-5'>函数</b>呢?