什么是内联函数

内联函数是指通过 inline 关键字定义的函数,包括全局函数和类的成员函数。

内联函数在编译阶段展开,编译器将整个函数体代码嵌入到调用处,不产生函数跳转。

内联函数的定义

inline 关键字必须用于函数体定义,在函数声明前使用无效

inline int add(int x, int y);   // 声明处使用无效
int add(int x, int y);   //正确声明方式inline int add(int x, int y) {  // 定义处使用有效return x + y;
}

内联函数优劣

优点:
①函数内联可以避免了频繁调用函数对栈内存重复开辟所带来的消耗,提高运行效率。
②内联函数可以允许全局函数重复定义,编译时会选取编译单元可见的函数进行内联。

缺点:
内联函数适用于频繁调用的短小函数,如果滥用,则也存在很多危害,比如:
①编译和链接的时间会更慢
②代码膨胀,占用更多的内存。
③影响 cpu 缓存优化,降低运行时性能。

inline 限制

inline 关键字仅仅是一种对编译器的建议,是否真的发生内联,要看编译器的分析,比如下面场景编译器会拒绝内联:

  • 函数体内部包含循环、递归、switch语句。
  • 函数过于复杂,复杂到函数本身执行的成本,比函数调用(栈开销)成本还要高。
  • inline 可以修饰虚函数,但是当虚函数表现多态性的时候不能内联,因为无法知道具体将哪一部分代码插入到调用位置。

与宏定义区别

内联函数和带参数的宏定义类似,都可以避免函数调用的开销,但是有以下区别

  • 内联函数在编译时展开,宏在预编译时展开
  • 内联函数直接嵌入到目标代码中,宏是简单的做文本替换
  • 内联函数有类型检测、语法判断等功能,而宏没有
  • inline 函数是函数,宏不是
  • 宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义

内联函数与类

对调用频繁且代码简单的成员函数可以使用内联函数. 则编译时此内联函数的执行代码会插入到每个调用它的地方

内联函数在类中的声明
隐式声明:把函数执行代码写在类主体内
显式声明:为了程序的可读性,一般为显式声明, 即函数实现时返回值类型前加inline; 类主体内如同一般的成员函数声明

示例:

class A
{public:void count(int x, int y); // 函数声明
}
//显示声明
inline void A::count(int x, int y) // 表明是一个内联函数
{}// 若是定义在类内,就是隐式内联了,比如,
//没有inline关键字,但系统默认count是内联函数
class A
{public:
void count(int x, int y){ /****/ }
}

复习笔记(四)——C++内联函数相关推荐

  1. C++学习笔记之——引用 内联函数

     本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 作者 ...

  2. 中谷教育Python21~24笔记——switch和内联函数

    1.首先,python并没有提供switch语句 2.python可以通过字典实现switch语句的功能.    实现方法分为两步: --首先,定义一个字典 --其次,调用字典的get()获取相应的表 ...

  3. c++内联函数解析(inline)

    一.基本定义 inline是C++语言中的一个关键字,可以用于程序中定义内联函数,inline的引进使内联函数的定义更加简单.说到内联函数,这里给出比较常见的定义,内联函数是C++中的一种特殊函数,它 ...

  4. c++之头文件基本输出,输入,名字空间,引用,内联函数,函数重载,缺省参数

    c++之头文件,基本输出,输入,名字空间,引用,内联函数,函数重载,缺省参数 文章目录 c++之头文件,基本输出,输入,名字空间,引用,内联函数,函数重载,缺省参数 前言 一.头文件,基本输出,输入 ...

  5. 【内联函数】inline关键字的作用与内联函数的特性

    学习导航 一.内联函数产生的意义 二.内联函数的使用 三.内联函数的作用 ①简单易懂 ②支持调试 ③支持类型检查 四.内联函数的特性 一.内联函数产生的意义  在C语言中,如果我们频繁调用某些函数,并 ...

  6. C++ | 内联函数

    内联函数在编译时进行展开,在调用点处产生一个函数体代码的拷贝.因此,对内联函数进行任何修改后,都需要对所有调用该函数的模块进行重新编译,否则它将会继续使用旧的函数. 如果想把一个函数定义为内联函数,则 ...

  7. c++学习笔记内联函数,函数重载,默认参数

    c++学习笔记内联函数,函数重载,默认参数 1 inline内联函数 C++中的const常量可以替代宏常数定义,如: const int A = 3;  #define A 3 C++中是否有解决 ...

  8. Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  9. Kotlin系列四:标准函数、扩展函数、高阶函数、内联函数

    目录 一 标准函数 1.1 作用域函数 1.1.1 let 1.1.2  with 1.1.3 run 1.1.4 apply 1.1.5 also 1.1.6 takeIf 与 takeUnless ...

最新文章

  1. mxnet 常用层,卷积激活损失
  2. ArrayList、LinkedList和Vector
  3. 【大讲堂第二期 | 第二场课程预告】全世界最出名的互联网公司的小伙伴都在这里!...
  4. CPU是什么?GPU是什么?有图有真相。
  5. 运行时错误7内存溢出_分别从运行时和GC的角度看JAVA8内存管理
  6. 华为智能手表与鸿蒙,不再是大号手环!华为鸿蒙手表来了:要和苹果抢生态?...
  7. const char * array[]和char * const array[]
  8. Python生态概览(二):网络爬虫、web信息提取、网站开发、网络应用开发
  9. 围成一圈的排列组合问题_行测技巧:巧解环形排列组合
  10. dpkg: error: dpkg status database is locked by another process 解决方法
  11. 智能建筑--常见协议
  12. 客户端 API 开发总结
  13. 华为培训视频-AAA培训
  14. Unicode汉字编码表
  15. 映泰主板G31安装centos系统启动不了解决办法
  16. 富士施乐Fuji Xerox DocuCentre-III C6500 驱动
  17. HorizontalScrollView+TabLayout+ViewPager+XUtils
  18. 终极选择---老男孩教育
  19. [WIN32]MessageBox用法
  20. 安卓游戏广告加速插件_【安卓】玩LOL手游吗?这有教程

热门文章

  1. 4. Leetcode 18. 四数之和 (数组-双向双指针)
  2. 错误记录 Could NOT find GTest (missing: GTEST_INCLUDE_DIR)
  3. 文巾解题 77. 组合
  4. 文巾解题 180. 连续出现的数字
  5. python文件操作2:在指定目录下查找指定后缀名的文件
  6. python 函数的*args,**kwargs
  7. 适合做公安网的php,gonganbeian.php
  8. amoeba高可用mysql_amoeba for mysql 使用说明
  9. numpy.tril详解
  10. python 模块(Module)和包