C/C++ 内联函数 inline 使用方法总结 笔记记录

道阻且长,行则将至。埋头苦干,不鸣则已,一鸣惊人!加油,骚年!
欢迎关注我的微信公众号:BabyCoder,将为您提供更多有用的文章,谢谢!

参考资料

参考网址

  【博客园】:C++ 中的 inline 用法
  【菜鸟教程】:C++ 中的 inline 用法(转载自上述博客园)

参考书本

  《C++ Primer 第五版》P213 页

  本文笔记大部分内容都可以从上述资料中找到~

自我总结

引入内联函数 inline 关键字的原因

  • 主要为了解决一些 频繁调用的 小函数 大量消耗栈空间(栈内存) 的问题;
  • 栈空间:指放置程序的局部数据(也就是函数内数据)的内存空间。
  • 在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题。例如:函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。
  • 调用函数一般比求等价表达式的值要慢一些。在大多数机器上,一次函数调用其实包含着一系列工作:调用前要先保存寄存器,并在返回时恢复;可能需要拷贝实参;程序转向一个新的位置继续执行。

内联函数概念

  • 在函数的 定义/实现 处,增加 inline 修饰符;
  • 定义在类中的成员函数缺省(默认)都是内联的;

内联函数相关特征

  • 内联函数可避免函数调用的开销;
  • 将函数指定为内联函数( inline ),通常就是将它在每个调用点上 “内联地” 展开;
  • 内敛说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求;
  • 一般来说,内联机制用于优化规模较小、流程直接、频繁调用的函数。很多编译器都不支持内联递归函数,而且一个 75 行的函数也不大可能在调用点内联地展开。

内联函数实际操作流程

  • 当我们把函数使用 inline 修饰为内联函数后,其他地方调用此函数,在编译时,会自动替换函数具体的实现方式(类比特征:内联地展开);
  • 因此使用内联函数,是以消耗内存空间为代价,换取程序的执行效率;

总结博客文章内容

  • 在 C 语言中,内联函数的定义最好放在头文件中。(应该是仅限 C 语言)

  • inline 是一种 “用于实现的关键字” ;也就是 inline 必须与 函数定义体 放在一起才能使函数成为内联,仅仅放在函数声明前,不起任何作用。

  • 作者认为 inline 不应该出现在函数的声明中。虽然不会影响函数功能,但是体现了高质量 C/C++ 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。

  • 慎用 inline

    • 内联是以 代码膨胀(复制) 为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。
    • 如果执行函数体内代码的时间,相比于函数调用的开销较大,效率收获会很少。
    • 每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。
  • 以下情况不宜使用内联

    • 如果函数体内的代码 比较长,使用内联将导致 内存消耗代价较高
    • 如果函数体内出现 循环,那么执行函数体内代码的时间要比函数调用的开销大。
    • 类的构造函数和析构函数容易让人误解成使用内联更有效。要当心 构造函数和析构函数可能会隐藏一些行为,如“偷偷地”执行了 基类或成员对象 的构造函数和析构函数。所以 不要随便地将构造函数和析构函数的定义体放在类声明中
  • 简要总结

    • 内联函数并不是一个增强性能的灵丹妙药。
    • 只有当 函数非常短小 的时候它才能得到我们想要的效果;但是,如果函数并不是很短而且在很多地方都被调用的话,那么将会使得可执行体的体积增大。
    • 如果内联函数不能增强性能,就避免使用它!

如果文章内容有误,麻烦评论/私信多多指教,谢谢!如果觉得文章内容还不错,记得一键三连哦(点赞、收藏、留言),您的支持就是对我最大的鼓励,谢谢您嘞!

你可能感兴趣的:(#,C/C++,#,C/C++相关)