一、什么是内联函数

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

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

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

下面我们来看一个例子:

#include <stdio.h>  //函数定义为inline即:内联函数
inline char* dbtest(int a)
{  return (i % 2 > 0) ? "奇" : "偶";
}   int main()
{  int i = 0;  for (i=1; i < 100; i++) {  printf("i:%d    奇偶性:%s /n", i, dbtest(i));      }
}

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

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

二、内联函数的编程风格

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

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

inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y)
{}

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

void Foo(int x, int y);
inline void Foo(int x, int y) // inline 与函数定义体放在一起
{}

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

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

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

三、慎用内联

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

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

以下情况不宜使用内联:

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

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

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

总结:

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

原文链接:内联函数 —— C 中关键字 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. 【Android 应用开发】Android开发 使用 adb logcat 显示 Android 日志
  2. mysql数据库的字符串表示什么意思_MySQL数据库的字符串类型详解(01)
  3. 终于!《iOS 全埋点解决方案》正式出版
  4. IE6、IE7、Firefox无提示关闭窗口的代码
  5. 日本老爷爷坚持17年用Excel作画,我可能用了假的Excel···
  6. linux gcc g++编译命令选项
  7. SpringCloud工作笔记055---SpringBoot中配置事物管理
  8. 实验4.2 实现客户机(CLIENT)类
  9. 海思hi3518 移植live555 实现H264的RTSP播放
  10. 【Java并发.3】对象的共享
  11. windows server winrm介绍
  12. 输入两个正整数m和n,求其最大公约数和最小公倍数。
  13. JavaScript对象的键值对
  14. 脱了裤子放屁之std::string
  15. 一句话读完:Spring Bean的生命周期
  16. Git使用教程:完全图解!
  17. 利用Python制作第一人称射击小游戏 含源代码
  18. 腾讯qq珊瑚虫版_12年来第二次更新:这个版本的QQ你还用吗
  19. 10.1登录成功提示、加载提示
  20. RouterOS-注册及申请license

热门文章

  1. 武汉理工大学计算机学院调剂,武汉理工大学计算机科学与技术学院2017年拟接收调剂研究生公告...
  2. lan8720ping不通|识别不到网线|0x7809
  3. 5G+VR直播,带来科技感爆棚的视觉盛宴
  4. html手机全面屏的适配,css实现适配iphone全面屏代码
  5. 学习国嵌嵌入式视频笔记
  6. 微信公众号网页在本地开发模式下如何使用正式环境的域名来调试
  7. java编程心得(十五)——将Unicode编码转换为汉字
  8. Odoo产品分析 (二) -- 商业板块(6) --采购(1)
  9. 企业邮箱如何绑定微信?微信怎么添加邮箱?
  10. php 中文文件名