IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ inline 内联函数特性解析及使用建议 -> 正文阅读

[C++知识库]C++ inline 内联函数特性解析及使用建议

内联函数

内联函数是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展;也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省每次调用函数时带来的额外时间开支。1
使用内联函数时必须考虑程序的占用空间执行效率

inline

C++中通过inline修饰符来建议编译器生成内联函数。

内联成员函数

在类声明中定义的成员函数,除了虚函数外,默认都是隐式地内联的。2

class A {
	int Fun() { return 0; }        //类内定义,隐式内联
}

class A {
	int Fun();
}
// .cpp文件中
inline int A::Fun() { return 0; }   // 类外定义,需显式内联

特性

内联函数相比于普通函数

优点

  1. 当函数体较小的时候,内联可以令目标代码更加高效。inline函数在被调用处进行代码展开,省去了调用普通函数会产生的参数压栈栈帧开辟与回收结果返回等步骤,以此来提高程序运行速度。3

缺点

  1. inline函数是以代码膨胀为代价来消除函数调用带来的开销的,意味着消耗更多的内存空间。
  2. inline函数在变更实现代码后需要重新链接。非内联函数则不需要。
  3. 内联是不能完全由程序控制。内联函数只是对编译器的建议,最终由编译器决定是否内联。2

内联函数相比于函数式宏定义

夹带着宏实参函数式宏定义(Function-like Macro)是通过对文本直接替换的方式,同样是在调用处展开代码来避免函数调用的开销。
宏只做预处理不编译,不会检查程序是否符合C语法。

函数式宏定义本身不必编译生成指令,但是代码中出现的每次调用所编译生成的指令都相当于一个函数体。

优点

  1. inline函数具有同一般函数的所有可预料行为。
    考虑下面这种情况:3
    #define GET_MAX(a, b) ((a) > (b) ? (a) : (b))	//内外层括号都不可以省
    
    int a = 5, b = 0;
    GET_MAX(++a, b);	//a被累加了两次
    GET_MAX(++a, b + 10);	//a被累加了一次
    
    调用函数时先求实参表达式的值再传给形参,如果实参表达式Side Effect,那么这些Side Effect只发生一次。但宏只是简单的文本替换,所以宏中的 a 都会被替换为 ++a 。由于 ++ a 比 b 大,所以第一个调用中的a会被累加两次。而 ++a 又比 b + 10 要小,所有第二个调用中的 a 只会被累加一次。文本替换难以做到与一般函数的行为一致。
  2. 在代码展开时会做类型安全性检查。函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心。
  3. 遵守函数的作用域访问规则。如内联函数可以访问类的成员变量,宏定义则不能。
  4. 内联函数是可调试的,宏定义则不可以。

使用建议

  1. 对于存取函数以及其他函数体比较短,性能关键的函数,推荐使用内联。一个较为合理的经验准则是,不要内联超过10行的函数。2
  2. 谨慎对待析构函数,析构函数往往比其表面看起来更长,因为有隐含的类成员和基类的析构函数被调用。
  3. 内联包含循环switch语句的函数往往是得不偿失的。因为光循环和switch语句本身就有一定的代码量。
  4. 递归函数通常不会被内联。因为递归层数在编译时可能是未知的。大多数编译器都不支持内联递归函数。4
  5. 虚函数表现多态性的时候不能内联。其他情况下是可以内联的。内联是在编译期建议编译器内联,而虚函数的多态性在运行期,编译期无法知道运行期调用哪个代码。inline virtual 唯一可以内联的时候是:编译器知道所调用的对象是哪个类,这只有在编译器具有实际对象而不是对象的指针或引用时才会发生。2

其他

C++17标准新加入了inline可用于修饰变量的规则5。不过不在内联函数范围内,有机会额外探讨。


  1. wikipedia 内联函数 ??

  2. interview - 📚 C/C++ 技术面试基础知识总结 ?? ?? ?? ??

  3. Effective C++ ?? ??

  4. C++ 内联函数 | 菜鸟教程 ??

  5. inline specifier - cppreference.com ??

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:20:07  更:2021-10-11 17:20:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 22:24:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码