内联函数(内嵌函数)浅析

原创 2016年05月30日 11:02:01

一、inline函数
inline(小心,不是online),翻译成“内联”或“内嵌”。意指:当编译器发现某段代码在调用一个内联函数时(注意,是在编译阶段而非预处理阶段,这是和宏函数的区别之一),它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是省去了调用的过程,加快程序运行速度。(函数的调用过程,参数入栈出栈、分配空间、传参、传返回值等操作,所以总要多占用一些时间)。这样做的不好处:由于每当代码调用到内联函数,就需要在调用处直接插入一段该函数的代码,所以程序的可执行文件体积将增大。内联函数并不是必须的,也不一定会被编译器执行,因为:

内联说明(inline specification)对于编译器来说只是一个建议,编译器可以选择忽略这个建议。
要修饰一个函数为内联型,使用如下格式: 
inline 函数的声明或定义 
简单一句话,在函数声明或定义前加一个 inline 修饰符。 
inline int max(int a, int b) 

return (a>b)? a : b; 
}

内联函数的本质是,节省时间但是消耗空间。

二、inline函数的注意事项

(1)、一个函数可以自已调用自已,称为递归调用(后面讲到),含有递归调用的函数不能设置为inline;

(2)、使用了复杂流程控制语句:循环语句和switch语句,无法设置为inline;

(3)、由于inline增加体积的特性,所以建议inline函数内的代码应很短小。最好不超过5行。

(4)、inline仅做为一种“请求”,特定的情况下,编译器将不理会inline关键字,而强制让函数成为普通函数。出现这种情况,编译器会给出警告消息。

(5)、在你调用一个内联函数之前,这个函数一定要在之前有声明或已定义为inline,如果在前面声明为普通函数,而在调用代码后面才定义为一个inline函数,程序可以通过编译,但该函数没有实现inline。比如下面代码片段: 
//函数一开始没有被声明为inline: 
void foo(); 
//然后就有代码调用它: 
foo(); 
//在调用后才有定义函数为inline: 
inline void foo() 

...... 

代码是的foo()函数最终没有实现inline;

(6)、为了调试方便,在程序处于调试阶段时,所有内联函数都不被实现。

    另外关于内联函数还有两个更令人头疼的问题。第一个问题是该如何进行维护。一个函数开始的时候可能以内联的形式出现,但是随着系统的扩展,函数体可能要求添加额外的功能,结果内联函数就变得不太可能,因此需要把inline specifier去除以及把函数体放到一个单独的源文件中。另一个问题是当内联函数被应用在代码库的时候产生。当内联函数改变的时候,用户必须重新编译他们的代码以反映这种改变。然而对于一个非内联函数,用户仅仅需要重新链接就可以了。


这里想要说的是,内联函数并不是一个增强性能的灵丹妙药。只有当函数非常短小的时候它才能得到我们想要的效果,但是如果函数并不是很短而且在很多地方都被调用的话,那么将会使得可执行体的体积增大。最令人烦恼的还是当编译器拒绝内联的时候。在老的实现中,结果很不尽人意,虽然在新的实现中有很大的改善,但是仍然还是不那么完善的。一些编译器能够足够的聪明来指出哪些函数可以内联哪些不能,但是,大多数编译器就不那么聪明了,因此这就需要我们的经验来判断。如果内联函数不能增强行能,就避免使用它!


三、内联函数使用说明

(1) 在一个文件中定义的内联函数不能在另一个文件中使用。它们通常放在头文件中共享。 
(2) 内联函数应该简洁,只有几个语句,如果语句较多,不适合于定义为内联函数。 
(3) 内联函数体中,不能有循环语句、if语句或switch语句,否则,函数定义时即使有inline关键字,编译器也会把该函数作为非内联函数处理。 
(4) 内联函数要在函数被调用之前声明。关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。


版权声明:本文为博主原创文章,未经博主允许不得转载。

java final方法与java内联函数

《java编程思想》中讲到final方法时提到,使用final方法原因有两个, 一、锁定方法。防止任何继承类修改、覆盖 二、效率。在java早期实现中,如果将一个方法指明为final,就是同意编译...
  • Rflyee
  • Rflyee
  • 2016年04月05日 19:28
  • 5126

内联函数的优缺点

在C++语言的设计中,内联函数的引入可以说完全是为了性能的考虑。因此在编写对性能要求比较高的C++程序时,非常有必要仔细考量内联函数的使用。 所谓“内 联”,即将被调用函数的函数体代码直接地整个插入...
  • Leonard2016
  • Leonard2016
  • 2017年06月17日 22:50
  • 524

C++内置函数(内嵌函数,内联函数)

调用函数时需要一定的时间和空间的开销。  C++提供一种提高效率的方法,即在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出去。这种嵌入到主调函数中的函数称为内置函数(inline fu...
  • oqqQuZi1234567
  • oqqQuZi1234567
  • 2014年12月10日 11:56
  • 1526

内联函数(inline)总结

1:定义:       它们看起来象函数,运作起来象函数,比宏(macro)要好得多,使用时还不需要承担函数调用的开销。当内联一个函数时,编译器可以对函数体执行特定环境下的优化工作。这样的优化对"正...
  • a623891391
  • a623891391
  • 2016年01月30日 20:15
  • 11629

c++ 内联函数 (讲解的TM真好)

1.  内联函数 在C++中我们通常定义以下函数来求两个整数的最大值: 复制代码 代码如下: int max(int a, int b) {  return a > b ? a : b;...
  • u011327981
  • u011327981
  • 2016年01月28日 16:49
  • 17568

题目:什么是内联函数

一、什么叫inline函数?  inline(小心,不是online),翻译成“内联”或“内嵌”。意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当...
  • lanmolei814
  • lanmolei814
  • 2015年03月19日 11:03
  • 1912

内联函数是怎么提高效率的

C++和C99均支持内联函数inline,按这个名称的意思应该是“在字里行间展开”,内联函数会在它被调用的位置展开 。 讨论之前,我们先来看一个故事:实验室搬至六楼,小件器件特别多,一同学正一件一件地...
  • yeswenqian
  • yeswenqian
  • 2013年12月09日 17:59
  • 1502

面试---内联函数和宏定义的区别

用内联函数取代宏:1.内联函数在运行时可调试,而宏定义不可以; 2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定 义则不会; 3.内联函数可以访问类的成员变量,宏定义则...
  • will130
  • will130
  • 2015年09月24日 15:58
  • 1225

iOS - 内联函数简述

最近看公司的项目 , 里面很多的static inline 修饰的函数 , 一脸懵比的我 , 只好百度百度 … 然后大致整理了下. 什么是内联函数 ? 内联函数也是函数 , 只是用 inline修饰...
  • coderMy
  • coderMy
  • 2016年10月24日 11:45
  • 148

CSS样式中内联、嵌入、外部样式

内联样式 内联样式是使用style属性添加到元素的样式。 This is a paragraph. 嵌入样式 当单个文档需要特殊的样式时,就应该使用嵌入样式表。你可以使用 标签在文档头部...
  • sunshinerou
  • sunshinerou
  • 2017年05月28日 08:29
  • 1234
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内联函数(内嵌函数)浅析
举报原因:
原因补充:

(最多只允许输入30个字)