一、什么是内联函数

在C语言中,如果一些函数被频繁的调用,不断地用函数入栈,即函数栈,则会造成栈空间或者栈内存的大量消耗,为了解决这个问题,特别的引入了inline关键字,表示为内联函数。栈空间指的是函数内数据的内存空间,在一个系统下,栈空间的资源是有限的,假如频繁大量的使用就会因栈空间的不足而导致出错,函数的死循坏递归调用的最终结果就是导致栈内存空间的枯竭。

像下面这个例子:

#include <stdio.h>

//函数定义为内联函数
inline char *dbtest(int a)
{
return (i % > ? "奇" : "偶");
} int main()
{
int i = ;
for (i = ; i < ; i++)
{
printf("i:%d 奇偶性:%s /n", i, dbtest(i));
}
return ;
}

此例子就是内联函数的标准用法,使用内联函数带来的好处就是,在每个for循坏内部任何调用dbtest(i)的地方都将会替换成(i % 2 > 0 ? "奇" : "偶"),因此,通过这样子的替换就可以避免了频繁调用函数对栈内存重复开辟所带来的消耗。

二、内联函数的编程风格

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

例如,下面风格的函数fun将不能成为内联函数:

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

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

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

2、关键字inline的使用是有所限制的

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

三、慎用内联

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

下面情况不适合使用内联函数:

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

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

四、static和inline联合使用

static是静态修饰符,由其关键字修饰的变量会保存到全局数据区,对于普通的局部变量或者全局变量,都是由系统自动分配内存的,并且当变量离开作用域的时候释放掉,而使用static关键字来修饰,只有当程序结束时候才会释放掉,使用static inline修饰时,函数仅在文件内部可见,不会污染命名空间,另外,函数在运行过程中也会分配内存空间,但是由于static的存在,就和修饰变量类似,它只会开辟一块内存空间。

最新文章

  1. 【IOS开发笔记02】学生管理系统
  2. iOS开发小技巧--iOS键盘 inputView 和 inputAccessoryView
  3. c#第三方控件地址
  4. C#Winform连接Oracle数据库 , 及角色讲解
  5. 如何知道某个网站的IP地址
  6. iOS简易图片选择器 (图片可多选,仿微信)
  7. Corba概念(GIOP、IIOP、IOR、ORB、IDL)
  8. ASP.NET easyUI--datagrid 通过ajax请求ASP.NET后台数据的分页查询
  9. SQL通用查询
  10. Spring Hibernate4 整合配置文档
  11. Mac安装Mysql过程
  12. css中em与px
  13. template method pattern
  14. VS公布 错 到文件失败 复制到
  15. CVE-2017-11882漏洞利用
  16. 解决警告: Setting property &#39;source&#39; to &#39;org.eclipse.jst.jee.server_:&#39; did not find a matching property.的方法
  17. [ZOJ 4016] Mergable Stack
  18. UnicodeEncodeError: &#39;gbk&#39; codec can&#39;t encode character &#39;\xbb&#39; in position 30633: illegal multibyte sequence
  19. 【机器学习_5】Anaconda:初学Python、入门机器学习的首选
  20. 找回密码的url分析

热门文章

  1. Linux组管理(6)
  2. Linux实用指令(5)
  3. nginx 反向代理时丢失端口的解决方案(转)
  4. MySql5.7配置文件my.ini 设置 my.ini文件路径
  5. webpack报错
  6. Centos7安装pip或pip3
  7. Spark GraphX图计算简单案例【代码实现,源码分析】
  8. Spring之IoC详解(非原创)
  9. MySQL报错合集解决办法: server has gone away, @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_MODE = ON
  10. PHP 多图上传,图片批量上传插件,webuploader.js,百度文件上传插件