百度百科
在C语言,实际上inline的出现是为了填补宏定义的缺点。
宏定义 是在编译器预编译的时候把define定义的关键字进行替换。
用宏定义的好处是宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作。
因此,效率很高,这是它在C中被使用的一个主要原因。
inline定义格式
1.inline定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换(像宏一样展开),没有了调用的开销,效率也很高。
2.很明显,类的内联函数也是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。
比如一个函数调用另一个函数:需要分配栈空间压栈执行出栈几个过程;
使用宏定义和inline可以直接在该函数代码展开执行,并无上述过程,非常高效。
但是使用宏定义传变参有个致命的缺点,而inline则克服了该缺点,如下:
如果不看运行结果,在我们直观程序觉得上述代码输出运算结果应该是一样的,等于6。
结论:
一、首先能确定的是宏定义和inline在函数直接展开执行的,即都是代码替换,并无调用函数的过程;(有疑问可反汇编看)
宏定义代码等效于:DEF_FUN(1 + 2) = 1 + 2 * 2 = 5, 原因就是:在预编译的时候x会替换成1+2,但是由于运算符优先级不同, * 号的优先级比 + 号高,故先乘后加,结果等于5。
而使用inline的函数在编译器在调用一个内联函数时,会像函数一样检查参数,确保无误。
故你看到上图参数在inline函数运行的时候已经把 1 + 2 = 3, 这个x的结果3先运算出来,再展开执行。
所以算出来的结果是6。
最后,内联函数和宏定义注意事项:
内联是以代码膨胀复制为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。
1、对于频繁使用的几句C语言语句,不使用推荐使用内联函数和宏定义,虽然内联函数和宏定义高效,但是频繁使用会导致代码空间膨胀。
2、对于C语言语句代码很长的,要复制代码, 将使程序的总代码量增大,消耗更多的内存空间,将导致内存消耗代价较高,不推荐使用。
扩展:
static __inline:静态内联,加上static修饰只是限制该内联函数的使用的作用域,不如只能在某个.c文件使用,与其他文件不相关。
static __forceinline:静态强制内联,加上static修饰只是限制该内联函数的使用的作用域,使用场景指有些编译器优化过程中会对内联函数出现警告或者错误,毕竟内联是以代码膨胀复制为代价,提高效率的。故固执的程序猿会使用强制内联函数。
全篇完。
本人博客仅仅代表我个人见解方便记录成长笔记。
若有与 看官老爷见解有冲突,我坚信看官老爷见解是对的,我的是错的。
感谢~!