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

    文章

    3882

    浏览量

    61310
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66799
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48625
收藏 人收藏

    评论

    相关推荐

    回调函数(callback)是什么?回调函数的实现方法

    回调函数是一种特殊的函数,它作为参数传递给另一个函数,并在被调用函数执行完毕后被调用。回调函数通常用于事件处理、异步编程和处理各种操作系统和
    发表于 03-12 11:46 301次阅读

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

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

    物理气相传输法生长SiC晶圆中的缺陷和测试

    和Si晶体拉晶工艺类似,PVT法制备SiC单晶和切片形成晶圆过程中也会引入多种缺陷。这些缺陷主要包括:表面缺陷引入深能级的点
    的头像 发表于 12-26 17:18 1430次阅读
    物理气相传输法生长SiC晶圆中的<b class='flag-5'>缺陷</b>和测试

    KUKA C4机器人:为宏启用或阻止内联窗体USER

    对于不同的宏类型,可以配置内联表单USER是否可用。默认情况下,USER在以下宏中可用
    的头像 发表于 12-18 11:38 537次阅读
    KUKA C4机器人:为宏启用或阻止<b class='flag-5'>内联</b>窗体USER

    python中如何引入math库

    在Python中,要使用math库,首先需要先引入它。math库是Python的一个标准库,它提供了许多数学函数和常数。通过使用math库,我们可以进行各种数学运算,例如三角函数、指数、对数、幂运算
    的头像 发表于 11-22 11:03 1973次阅读

    瑞萨电子深度学习算法在缺陷检测领域的应用

    浪费大量的人力成本。因此,越来越多的工程师开始将深度学习算法引入缺陷检测领域,因为深度学习在特征提取和定位方面取得了非常好的效果。
    的头像 发表于 09-22 12:19 507次阅读
    瑞萨电子深度学习算法在<b class='flag-5'>缺陷</b>检测领域的应用

    结构函数的由来及推导过程

    在前面的《T3Ster结构函数应用-双界面分离法测试RθJC(θJC)》文章中,我们介绍了结构函数的一些应用双界面分离法测试RJc,结构函数应用于产品内部缺陷分析,界面材料对比,老化分
    的头像 发表于 09-19 10:50 1232次阅读
    结构<b class='flag-5'>函数</b>的由来及推导过程

    复变函数的共轭和原函数的关系

    复变函数的共轭和原函数的关系  复变函数的共轭与原函数之间存在着密切的关系,这是因为共轭和原函数都是复数
    的头像 发表于 09-07 16:43 4925次阅读

    一文详解函数指针与回调函数

    函数指针是指向函数的指针变量。它允许我们将函数作为参数传递给其他函数或将函数作为返回值返回。函数
    发表于 08-22 10:36 191次阅读

    PCB缺陷有哪些?如何检查PCB缺陷

    今天主要是关于:PCB 缺陷以及如何检查PCB的缺陷
    发表于 08-18 11:05 687次阅读
    PCB<b class='flag-5'>缺陷</b>有哪些?如何检查PCB<b class='flag-5'>缺陷</b>?

    为什么引入Lambda?C++11 Lambda表达式介绍

    Lambda表达式是一个可以内联在我们代码中的函数,我们可以将他传递给另外一个函数
    的头像 发表于 07-18 16:26 443次阅读

    基于GAN的零缺陷样本产品表面缺陷检测

    缺陷检测是工业生产过程中的关键环节,其检测结果的好坏直接影响着产品的质量。而在现实场景中,但产品瑕疵率非常低,甚至是没有,缺陷样本的不充足使得需要深度学习缺陷检测模型准确率不高。如何在缺陷
    的头像 发表于 06-26 09:49 623次阅读
    基于GAN的零<b class='flag-5'>缺陷</b>样本产品表面<b class='flag-5'>缺陷</b>检测

    ESP8266 HTML工作正常,不能内联CSS是为什么?

    内联 CSS 的示例: “This is a red heading with a black background\" 我无法让 C++ IDE 像这样解释该行是。有解决办法吗?
    发表于 06-12 08:07

    支持向量机(核函数的定义)

    根据机器学习相关介绍(10)——支持向量机(低维到高维的映射),支持向量机可通过引入φ(x)函数,将低维线性不可分问题转换为高维线性可分问题。
    的头像 发表于 05-20 10:41 555次阅读
    支持向量机(核<b class='flag-5'>函数</b>的定义)

    在Rust中使用内联汇编

    与 GCC 内联汇编语法一样,Rust 希望即使需要手写汇编,程序员也能将一部分工作交给编译器来高效完成,这部分工作就是寄存器分配,毕竟只有编译器了解内联汇编前后的上下文,知道该怎么分配寄存器最合适。
    的头像 发表于 05-04 09:54 571次阅读