一、什么是内联函数

在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。

为了解决这个问题,特别的引入了inline修饰符,表示为内联函数

栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。

下面我们来看一个例子:

[cpp] view plaincopy
  1. #include <stdio.h>
  2. //函数定义为inline即:内联函数
  3. inline char* dbtest(int a)
  4. {
  5. return (i % 2 > 0) ? "奇" : "偶";
  6. }
  7. int main()
  8. {
  9. int i = 0;
  10. for (i=1; i < 100; i++)
  11. {
  12. printf("i:%d    奇偶性:%s /n", i, dbtest(i));
  13. }
  14. }

上面的例子就是标准的内联函数的用法,使用inline修饰带来的好处我们表面看不出来,其实在内部的工作就是在每个for循环的内部任何调用dbtest(i)的地方都换成了(i%2>0)?"奇":"偶"这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。

其实这种有点类似咱们前面学习的动态库和静态库的问题,使 dbtest 函数中的代码直接被放到main 函数中,执行for 循环时,会不断调用这段代码,而不是不断地开辟一个函数栈。

二、内联函数的编程风格

1、关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用

如下风格的函数Foo 不能成为内联函数:

[cpp] view plaincopy
  1. inline void Foo(int x, int y); // inline 仅与函数声明放在一起
  2. void Foo(int x, int y)
  3. {
  4. }

而如下风格的函数Foo 则成为内联函数:

[cpp] view plaincopy
  1. void Foo(int x, int y);
  2. inline void Foo(int x, int y) // inline 与函数定义体放在一起
  3. {
  4. }

所以说,inline 是一种 “用于实现的关键字” ,而不是一种“用于声明的关键字”。一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内联函数的声明、定义体前面都加了inline 关键字,但我认为inline 不应该出现在函数的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。

2、inline的使用是有所限制的

inline只适合涵数体内代码简单的函数数使用,不能包含复杂的结构控制语句例如while、switch,并且内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。

三、慎用内联

内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数?如果所有的函数都是内联函数,还用得着“内联”这个关键字吗?

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

以下情况不宜使用内联:

(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。

(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。

一个好的编译器将会根据函数的定义体,自动地取消不值得的内联(这进一步说明了inline 不应该出现在函数的声明中)。


总结:

因此,将内联函数放在头文件里实现是合适的,省却你为每个文件实现一次的麻烦.而所以声明跟定义要一致,其实是指,如果在每个文件里都实现一次该内联函数的话,那么,最好保证每个定义都是一样的,否则,将会引起未定义的行为,即是说,如果不是每个文件里的定义都一样,那么,编译器展开的是哪一个,那要看具体的编译器而定.所以,最好将内联函数定义放在头文件中.

内联函数 —— C 中关键字 inline 用法解析相关推荐

  1. 内联函数 —— C 中关键字 inline 用法解析(转载)

    一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗. 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放 ...

  2. C++11 中的内联函数、auto关键字、for循环及空指针

    C++ 3 内联函数 概念 特性 auto关键字 定义 使用 auto与指针结合起来使用 在同一行定义多个变量 auto不能推导的场景 auto不能作为函数的参数 auto不能直接用来声明数组 基于范 ...

  3. java内联函数,JVM中的步骤内联

    JVM中的方法内联 在C++中,可以明确定义内联函数,使用inline关键字.在Java中不能定义内联函数,但是方法的内联在JIT编译中还是存在的,只不过是JIT自动优化的,我们无法在写代码的时候指定 ...

  4. 【C++修行之路】引用、内联函数、auto关键字、范围for循环

    ✔️本文主题:引用 C++ 内联函数 auto关键字 范围for循环 ✔️本文作者:蓝色学者 文章目录 一.前言 二.引用 三.内联函数 四.auto关键字 五.范围for循环 六.结语 一.前言 大 ...

  5. inline内联函数(声明前加inline还是定义前加inline)

    原文地址:http://blog.csdn.net/nanhaizhixin/article/details/7564084 (一)inline函数(摘自C++ Primer的第三版) 在函数声明或定 ...

  6. 内联函数(inline 函数)详解

    inline 函数详解 定义 内联函数和普通函数一样,区别仅仅是在被调用处直接使用机器码替换的形式. 直接采用机器码替换的目的是:减少因调用而造成的开销,加速执行效率. 很多编程语言包括:c,c++, ...

  7. [C++] 内联函数inline 以及 auto关键字 -- C++入门(4)

    本篇文章主要包括内联函数和auto关键字.其中,内敛函数包括概念,特性等:auto关键字的使用规则,使用场景等. 目录 1.内敛函数 1.1问题引入: 1.2内联函数的概念 1.3内敛函数的特性 2. ...

  8. c语言inline不起作用,C语言inline内联函数学习小结

    //inline(内联)函数:将普通的函数定义为inline函数,可以避免普通函数入栈出栈的开销,它是将函数内的代码直接粘贴到调用处.除此之外,它和普通函数无异. //要成为inline函数必须具备以 ...

  9. C++ C++基础语法入门总结(二)引用-内联函数-C++11新特性

    C++基础语法入门总结 C++引用 再谈引用和指针 C++内联函数 附加C++11新特性 auto关键字 基于范围的for循环 指针空值nullptr C++引用 引用:就是某一变量(目标)的一个别名 ...

最新文章

  1. Java开发需掌握的常用Linux命令(持续更新)
  2. Day 24: 使用Yeoman自动构建Ember项目
  3. 对线性回归,logistic回归和一般回归的认识
  4. Bit-Z转入GXS、PPS、SPHTX、EOS未到账解决方案
  5. wxWidgets:wxMessageOutput类用法
  6. python widnows mysql_python用Windows开发配置mysql数据库
  7. Linux下文本编辑 .
  8. H计算机语言吗,计算机考研面试------编程语言
  9. 2018青岛大学计算机考研真题,2018年青岛大学师范学院880数学基础综合[专业硕士]之数学分析考研基础五套测试题...
  10. HashSet底层存储元素的源码分析
  11. js封装cookie
  12. 试手 破解多开限制
  13. android中图片压缩上传方法之Luban库
  14. DOS命令:comp
  15. win8 修改背景色为绿豆沙颜色
  16. 16S rDNA测序和宏基因组测序区别
  17. python3代码换行与不换行问题
  18. 架构师推荐书籍 一
  19. MAC上自定义Office word快捷键
  20. xctf攻防世界 MISC高手进阶区 Miscellaneous-300

热门文章

  1. Linux命令与shell
  2. 安装linux的准备
  3. 使用数据库的压测工具super-smack测试mysql数据库性能
  4. 高斯金字塔 拉普拉斯金字塔_金字塔学入门指南
  5. 678. 有效的括号字符串
  6. leetcode 1833. 雪糕的最大数量
  7. leetcode 703. 数据流中的第 K 大元素(堆)
  8. 2019大数据课程_根据数据,2019年最佳免费在线课程
  9. react中使用构建缓存_使用React和Netlify从头开始构建电子商务网站
  10. Smobiler 4.4 更新预告 Part 1(Smobiler能让你在Visual Studio上开发APP)