一、inline的定义
从目的上来说,inline是一种用空间来换时间的方法。
从历史渊源来说,C90标准才开始支持inline的语法。原来的MACRO同样是这个目的。但是inline比MACRO多了类型检查,而且只是一种建议,编译器不采纳时可以退化为函数。
从实现上来说,gcc对C90,C99的标准实现了一定的扩充(比如extern Inline)。
值得注意的是:inline仅仅是一种对编译器的建议,如果编译器审核不通过(比如递归、函数地址调用、函数体太长等等),则inline生效,与普通函数无异(即产生单独的汇编代码,拥有函数地址)。
同时由以上可以看出,Inline通常应该放在头文件中。
二、C语言的inline
在此以gcc的实现为讨论基础。
inline: 普通inline
static inline: 本编译单元内可见。编译器审核通过则展开,否则作为函数。在C语言中static与inline经常组合,如果没有static,inline失败的时候,一堆全局函数冲突~~~
extern inline: inline成功,则使用本编译单元的inline版本。inline失败,则外部也有函数(此时,如果外部没有,则链接错误)
看一下linus的描述:"static inline" means "we have to have this function, if you use it, but don't inline it, then make a static version of it in this compilation unit". "extern inline" means "I actually _have_ an extern for this function, but if you want to inline it, here's the inline-version".
三、C++的inline
主要关注类的成员函数。
类的成员函数缺省都是内联的——前提是定义类时提供类的成员函数定义,此时可以不用inline关键字。
如果定义类时没有提供类的成员函数定义,则必须在类外边用inline关键字定义,否则视为普通函数。
我
参考文献:
http://www.cnblogs.com/mlj318/archive/2011/12/20/2295024.html
http://www.cnblogs.com/pengyingh/articles/2405718.html