Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >宏函数比普通函数效率高

宏函数比普通函数效率高

作者头像
小锋学长生活大爆炸
发布于 2020-10-28 03:26:12
发布于 2020-10-28 03:26:12
1.4K0
举报

总结一句话:一般情况下,普通函数调用有调用过程的开销,而宏函数是直接替换没有开销,因此效率更高。

  1. 函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以危险性高;但因为省去了函数的调用、返回、释放,所以效率比自定义函数高;那些简短并且被频繁调用的函数经常用函数式宏定义来代替实现。
  2. 调用真正函数的代码和调用函数式宏定义的代码编译生成的指令不同。使用函数式宏定义编译生成的目标文件会比较
  3. 在执行复杂功能时,如递归,函数式宏定义往往会导致较低的代码执行效率。
  4. 一个函数调用过程所需要的信息一般包括以下几个方面:
  • 函数的返回地址;
  • 函数的参数;
  • 临时变量;
  • 保存的上下文:包括在函数调用前后需要保持不变的寄存器。
  1. 宏定义、宏函数不做语法检查,只是简单的文本替换。用空间换时间,对较简短的函数,用宏函数替代函数。
  2. 宏占用了编译时间,函数占用执行时间
  3. 宏的参数不占用存储空间,因为它只是替换字符串;调用函数时的参数传递就是特定变量,形式参数之间的信息传递。作为函数的局部变量,显然会占用内存。
  4. 函数调用需要付出一定的时间空间开销,因为系统在调用函数时必须保留场景,然后转移到被调用函数执行,调用完成,返回到调用函数,然后继续场景。这些操作显然不在宏中。
  5. 函数调用必须将程序执行的顺序转移给函数执行功能的程序内容后,存储在存储器中的地址,然后返回执行放置在函数之前. 此传输操作需要保存场景并记住执行位置,然后再传输至执行地址。回该站点后,必须还原该站点,并根据原始保存的地址继续执行。因此,必须有一个函数调用,时间和空间的成本将影响其效率。
  6. 宏就放在预处理的地方,代码在没有额外空间和时间开销的情况下展开,此功能效率更高。在编译之前的预处理阶段,宏已经不见了,它的C语言代码则被替换到被调用处了,这是它与函数的区别之一——根本不会有调用过程的开销
  7. 以下情况可以选择宏,其他情况最好选用函数
  • 一般来说,用宏来代表简短的表达式比较合适。
  • 在考虑效率的时候,可以考虑使用宏,或者内联函数。
  • 在头文件保护(防止重复包含编译),条件编译中的#ifdef#if defined以及assert的实现。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C语言预处理超详解
在上篇博客中我们讲过:#define 会在预处理阶段展开,而对于预定义来说,展开就是把出现 name 的地方直接替换为 stuff,所以如果是第一行定义,这个代码展开后就是这样的:
fhvyxyci
2024/09/24
1050
C语言预处理超详解
函数宏:短小精干长得丑
C语言预处理器是编译器的一部分,在编译前处理源代码。预处理器的任务是根据源代码中的 预处理指令(以#开头)对代码进行转换和扩展,生成一个没有预处理指令的新代码文件,供后续编译器处理。
云深无际
2025/01/07
680
函数宏:短小精干长得丑
快速从C过度C++(二):引用,内联函数,nullptr
📝前言: 本文章适合有一定C语言编程基础的读者浏览,主要介绍从C语言到C++过度,我们首先要掌握的一些基础知识,以便于我们快速进入C++的学习,为后面的学习打下基础。上一篇文章快速从C过度C++,我们讲述了namespace,C++的输入和输出,缺省参数,函数重载。 这篇文章主要介绍: 1,引用 2,内联函数 3,nullptr
用户11029137
2025/03/07
710
EasyC++31,内联函数
内联函数是C++当中为了提高程序运行效率的设计,老实讲我没有在其他语言当中看到类似的设计。它和常规函数之间的主要区别不在于编写的方式,而是在于C++编译器会将内联函数组合到程序当中执行。
TechFlow-承志
2022/08/26
3000
【细品C++】内联函数
本篇文章件将帮助你了解C++的内联函数。内联函数的概念并不难理解,功能也十分清晰,就是降低频繁调用内容短小函数时建立函数栈帧时所带来的消耗,在C中,可以用宏函数解决,但不够好,于是C++设计出了内敛函数。希望本篇文章能对你C++的内联函数学习有所帮助。
Crrrush
2023/06/23
1570
【细品C++】内联函数
【C++】内联函数
在C语言中,为了解决类似的问题,我们学习了使用类函数宏来替换这些大量重复使用但又并不复杂的函数,如,将求两数中的最大值的函数改写为类函数宏:
修修修也
2024/04/01
1040
【C++】内联函数
C语言内联函数,提升C技巧必备
内联函数是C语言从C++中借鉴过来的,适当的使用内联函数可以提高程序的执行效率。本篇文章就来讲解下内联函数,赶紧来看下吧!
混说Linux
2023/02/24
8150
C语言内联函数,提升C技巧必备
【C语言笔记】带参宏定义(二)
其中参数列表中的参数之间用逗号分隔,字符序列中应包含参数表中的参数。在定义带参数的宏时,宏名标识符与左圆括号之间不允许有空白符,应紧接在一起,否则变成了无参数的宏定义。
正念君
2019/06/26
3.1K0
【C语言笔记】带参宏定义(二)
C++打怪升级(三)- 内联函数 、auto、范围for循环
在C语言中,我们通常会把完成特定功能的代码封装为一个函数,这样的函数可能完成者复杂的功能从而具有较多的代码长度,同时也有着许许多多的只完成简单功能的函数,这些函数内部通常只有几行代码。 比如: 完成交换功能的函数
怠惰的未禾
2023/04/27
5250
C++打怪升级(三)- 内联函数 、auto、范围for循环
【C语言】内联函数总结
inline关键字是C99标准的型关键字,其作用是将函数展开,把函数的代码复制到每一个调用处。这样调用函数的过程就可以直接执行函数代码,而不发生跳转、压栈等一般性函数操作。可以节省时间,也会提高程序的执行速度。
嵌入式与Linux那些事
2024/02/26
4170
【C语言】内联函数总结
【C++入门】内联函数inline
我们都知道一个函数的调用需要经历传参,创建栈帧,压栈,栈帧销毁等等过程。如果一个函数调用次数多而整体又相对比较简短,那么在频繁的调用中会影响程序整体的效率。那么如何解决这一问题?
薄荷冰
2024/01/22
1380
【C++入门】内联函数inline
[C++面试]宏相关问题
C++中用#define <宏名> <字符串>命令定义宏,在代码中将字符串替换宏名出现的位置。定义宏的方式根据是否包含参数可以分为两种:
TOMOCAT
2021/12/16
7670
Sliverwave四旋翼固件分析.三(蜂鸣器驱动)​
1.宏函数会在编译预处理时展开,只占编译时间,函数调用则会占用运行时间(分配单元,保存现场,值传递,返回),每次执行都要载入,所以执行相对宏会较慢。
云深无际
2022/12/17
3180
Sliverwave四旋翼固件分析.三(蜂鸣器驱动)​
【C++】内联函数、auto关键字、NULL与nullptr
我们在C语言阶段就学习了关键字#define 用来定义宏(宏函数、宏常量),然后在预处理阶段会实现宏的替换,这样的话不仅大大的提高了代码的复用性(不会把代码写死,更改起来方便),而且还提高了整体的性能。但是,宏替换也存在着一些缺点:
诺诺的包包
2023/02/20
4330
详解程序的预处理与编译与连接
程序执行的过程: 1.程序必须载入内存。在有操作系统的环境中:一般这个由操作系统来完成。在独立的环境中,程序的载入必须由手工安排,也可能通过可执行代码置入只读内存来完成。 2.程序的执行开始,接着便调用main函数。 3.开始执行程序代码。这个时候程序将一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储来静态内存中的变量在程序的整个执行过程一直保留它们的值。 4.终止程序。正常终止main函数;也可能是意外终止。
Yui_
2024/10/16
770
详解程序的预处理与编译与连接
C++之内联函数
  C++继承C的一个重要特性是效率,在C中保护效率的一个方法是使用宏(macro),宏的实现是使用预处理器而不是编译器,预处理器直接用宏代码替换宏调用,所以就没有了参数压栈、生成汇编语言的CALL、返回参数、执行汇编语言的RETURN的时间花费,所有的工作由预处理器完成,因此不用花费什么就具有了程序调用的便利和可读性。
全栈程序员站长
2022/07/14
3530
C/C++中----->#define定义函数和自定义函数各方面比较
#define宏:每次使用时,宏代码都被插入到程序中。除了非常小的宏之外,程序的长度将大幅度增长
玖柒的小窝
2021/09/15
1.5K0
C++之内联函数
函数调用要开辟栈帧,如果是一些稍微复杂的递归问题或者排序问题(含有交换比较多,例如快排)就会导致开辟的函数栈帧的数量太多了,那么有没有什么办法可以优化一下这个函数栈帧呢?
摘星
2023/04/28
5920
C++之内联函数
【C++指南】inline内联函数详解
C语言实现宏函数也会在预处理时替换展开,可以提高程序的执行效率,但是宏函数实现很复杂很容易出错的,且不方便调试,C++设计了inline目的就是替代C的宏函数。
倔强的石头
2024/12/06
1760
【C++】踏上C++学习之旅(四):细说“内联函数“的那些事
本章来聊一聊C++的创作者"本贾尼"大佬,为什么要创作出内联函数,以及内联函数的定义和内联函数的实现机制等等。
埋头编程
2024/10/31
970
【C++】踏上C++学习之旅(四):细说“内联函数“的那些事
相关推荐
C语言预处理超详解
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文