1:定义:是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时又称在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(具体视语法环境),从而节省了每次调用函数带来的额外时间开支。
但在选择内联函数的时候,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的、比较复杂的函数进行inline将带来很大的储存资源开支。
另外还需要特别注意,对递归函数的inline可能引起部分编译器的无穷编译。
2:设计目的:inline是一种特别的用于消除调用函数所造成的固有的时间消耗的方法。一般用于能够快速执行的函数,因为在这种情况下函数调用的时间消耗显得更为突出。这种方法对于很小的函数也有空间上的益处。并且它也使得一些其他的优化成为可能。
没有内联函式,程序员难以去控制那些函数内联哪些不内联,一切都有编译器自行决定。加上这种控制维度准许特定于应用的知识,诸如 执行函数时的频繁程度,以及被利用于选择哪些函数要内联。
在C++中:内联函数与编译模型联系紧密,有必要在每个使用它的模块中定义一个内联函数,而与之相对应的,普通函数必须定义在单个模板中。这使得模板编译独立于其他的模板。
3:与宏的比较:
宏:Macro,是一种批量处理的的称谓。 计算机科学里的宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编程语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。
宏的用途在于自动化频繁使用的序列或者是获得一种更强大的抽象能力。
计算机语言如C语言或汇编语言有简单的宏系统,有编译器或者汇编器的预处理器实现,C语言的宏处理器的工作只是进行简单的文本搜索和替换。
①宏调用并不执行类型检查,甚至连正常参数也不检查,但是函数调用却要检查。
②C语言的宏使用的是文本替换,可能导致无法预料的后果,因为需要重新计算参数和操作顺序。
③在宏中的编程错误很难发现,因为它们引用的是扩展的代码,而不是程序员键入的。
④许多结构体使用宏或者使用不同的语法来表达会很难理解。内联函数的使用与普通函数相同的语言,可以随意的内联和不内联。
⑤内联代码的调试信息 通常比扩展的宏代码更有用。
4:内联函数的不足:
①通常,编译器比程序设计者更清楚 对于一个特定的函数 是否适合进行内联扩展;一些情况下,对于程序员指定的某些内联函数,编译器可能更倾向于不使用内联甚至根本无法完成内联。(实际上就是内联依旧是有编译器决定,程序设计者所能做的,仅仅是把一个函数当作inline候选人)
②对于一些开发中的函数,它们可能从原来不适合内联扩展变得适合。或者由适合从而变得不适合。尽管内联函数或者非内联函数的转换易于宏的转换,但增加的维护开支还是使得它的优点显得更不突出。
③对于基于C的编译系统,内联函数的使用可能大大增加编译时间,因为每个调用函数的地方都需要替换成函数体,代码量的增加也同时带来了潜在的编译时间的增加。
5:自身对于inline的理解
例如 #define max(x ,y) x>y?x:y;
为一个宏命令,int x = max(2,3); //x = 3;
inline int max(int a,int b)
{
return a > b ? a : b;
}
int x = max(2,3);
在执行这条语句的时候,会发生跟宏一样的事情,讲max换成函数体,从而不需要进入函数的过程。(只是我自己通过这篇文章这样理解的,也没有人告诉我答案);
6://参考文献:Inline function - Wikipedia
7:inline与类的关系:
对于成员函数来说,如果定义在类体中,即使没有使用inline关键词,该成员也被认定是内联成员函数。
对于内联函数来说,程序会在函数调用的地方直接插入函数代码,如果函数体语句较多,则会导致程序代码碰撞。如果类的析构函数定义为内联函数,则可能导致潜在的代码膨胀。