一、什么是内联函数

在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 不应该出现在函数的声明中)。

总结:

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

原文链接:https://blog.csdn.net/zqixiao_09/article/details/50877383

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

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

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

  2. mysql 内联函数_内联函数 - freeboy小亮 - 博客园

    (1)什么是内联函数? 内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内. (2)为什么要引入内联函数? 当然,引入内联函数的主要目的是:解决程序中函数调用的效率问题.另外,前面我们 ...

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

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

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

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

  5. 内联函数 —— C 中关键字 inline 用法解析

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

  6. 内联函数什么时候展开_内联函数

    内联函数什么时候展开 You know all of those Util files you create with all sorts of small functions that you en ...

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

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

  8. java内联函数_Java之内联函数_内联函数的优缺点

    描述 内联函数 1.内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度. 2.Java语言中有一个关键字fina ...

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

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

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

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

最新文章

  1. 1078 Hashing
  2. 2013年的财务预算
  3. ale插件 vim_Vim之代码异步检测插件 ALE -- 实时检查verilog等代码的正确性
  4. SAP UI5 应用开发教程之十三 - 如何添加自定义 CSS 类
  5. 博士期间要注意的几个问题
  6. linux远程监控毕业设计,毕业设计论文:基于嵌入式Linux远程监控系统的设计与实现.doc...
  7. 突发!贾跃亭或将申请个人破产重组
  8. 作为一个生鲜电商自媒体
  9. NMAP命令探测端口是否开通
  10. 商品分类,手机云进销存ERP门店零售批发仓库开单APP软件,文具五金服装鞋帽酒店烟酒饰品批发条码管理
  11. 数字孪生:迈向未来,智慧城市大脑运营方案及整体建设解决方针
  12. oracle:根据出生日期计算年龄
  13. 一套完整的后台管理系统
  14. linux输出替换字符串,Linux命令之sed-替换字符串
  15. GPU 渲染管线与着色器 大白话总结 ---- 一篇就够
  16. 解决el-table 树形结构expand 操作后 stripe 显示失效问题
  17. java编程:假定公鸡5元钱1只,母鸡3元钱1只,小鸡1元钱3只。现在有100元钱要求买100只鸡,请编程列出所有可能的购鸡方案。
  18. 福利 | 启迪之星2018首期AI创业加速营免费名额
  19. 坑爹的hiredis API使用
  20. ROS tf::TransfromBroadcaster tf::TransformListener listener.lookupTransform listener.waitForTransfor

热门文章

  1. HTML(五)列表,区块,布局,表单和输入
  2. [JSOI2017]原力(分块+map(hash))
  3. 从此使用linux系统,但是QQ是必不可少的!!该篇文章方法成功!!!已验证!!!!!...
  4. -个很个性的二本人计时
  5. Mybatis缓存的使用和注意事项
  6. Oracle查询优化改写技巧与案例总结二
  7. SpringMVC结合ajaxfileupload文件无刷新上传
  8. 前端手残党福利(BootstrapCV大法)
  9. 当纺织遇上阿里云,数学博士钻进车间要让企业更高效
  10. 面向能源效率的云计算