美文网首页
宏、普通函数、内联函数之间的区别

宏、普通函数、内联函数之间的区别

作者: zlrs | 来源:发表于2020-02-29 17:23 被阅读0次

普通函数

  • 调用时向栈中push函数帧,调用结束后pop函数帧。编译器会在函数调用语句的前后,插入入栈和出栈的辅助代码。
  • 函数帧中存在的东西有:实参(值传递,如果参数是对象则调用拷贝构造函数)、返回地址(指向caller的下一句指令)、原栈指针%ebp、局部变量、某些通用寄存器的快照等。
  • 存在入栈出栈、复制参数、快照通用寄存器的开销,调用代价大于内联函数。

内联函数

比普通函数调用性能高,体现在

  1. 没有函数调用的开销,主要是参数压栈、栈帧开辟与回收,以及寄存器保存与恢复
  2. 编译器能掌握更多代码的信息,有助于编译器更深入地优化代码。编译器在处理调用内联函数的函数时,因为可供分析的代码更多,因此它能做的优化更深入彻底。前一条优点对于开发人员来说往往更显而易见一些,但往往这条优点对最终代码的优化可能贡献更大。

注意点

  1. 由编译器完成展开。
  2. 由于CPP是按编译单元编译的。一个编译单元被编译时不知道其它编译单元的存在。所以假设此编译单元中需要展开某个内联函数,那么这个内联函数必须在此编译单元内可见。又根据“唯一定义原则”,内联函数的最佳实践是将内联函数的定义放入头文件中;所有需要用到这个内联函数的编译单元都include该头文件。(显然根据缺点2,若该头文件中内联函数的实现变了,那么所有include该头文件且调用了该内联函数的编译单元都得重新编译)

内联函数的缺点

  • 缺点1:当内联函数函数体内的代码量大于普通函数入栈、出栈的辅助代码,且编译单元中大量调用此内联函数时,大量的函数展开将增大代码体积。
  • 缺点2:大型项目中,多个编译单元使用到同一内联函数时,修改此内联函数的实现将导致这些编译单元都得重新编译。如果是普通函数调用则仅有函数的实现文件需要重新编译。

  • 由预处理器完成展开。
  • 不是函数,不属于编译器管理范畴,没有类型检查机制。
  • 是文本替换,在想当然的在参数上使用++、--等操作符时,可能出现奇怪的问题。

相关文章

  • 宏、普通函数、内联函数之间的区别

    普通函数 调用时向栈中push函数帧,调用结束后pop函数帧。编译器会在函数调用语句的前后,插入入栈和出栈的辅助代...

  • C/C++知识点分享(29)

    1.宏与内联函数的区别 解析:内联函数和宏都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数...

  • 王道程序员求职宝典(十)函数,栈与队列

    函数 参数传递值传递指针传递引用传递指针引用*& 内联函数成员函数内联普通函数内联宏定义 默认参数从右向左设定默认...

  • C/C++知识点分享(12)

    1.内联函数和宏的差别? 答:内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函...

  • C++ : 内联函数和引用变量,赶紧get一下

    一、内联函数 内联函数和普通函数的使用方法没有本质区别,我们来看一个例子,下面展示了内联函数的使用方法: #inc...

  • C++ inline 和 #define

    inline是以代码膨胀(复制)为代价的,仅仅省去了函数调用的开销,从而提高函数的执行效率。 内联函数和宏的区别:...

  • C++基础-(函数)

    C++基础 函数 内联函数 内联函数非常短的函数适合于内联函数体会到插入到发生函数调用的地方普通函数调用多次也只有...

  • 内联函数,重载函数,参数默认的函数

    内联函数 内联函数和宏差不多,要是时间不要空间;关键字inline。内联函数中,不能有复杂的控制语句,比如if或f...

  • Kotlin函数式编程 (4)✔️内联函数

    ✔️自定义内联函数使用 let 函数使用 with 函数使用 apply 函数with 和 apply 函数区别?...

  • 1. Kotlin 常用关键字

    inline 内联函数内联函数与普通的函数有点不同。一个内联函数会在编译的时候被替换掉,而不是真正的方法调用。这在...

网友评论

      本文标题:宏、普通函数、内联函数之间的区别

      本文链接:https://www.haomeiwen.com/subject/vghmhhtx.html