inline函数和#define宏定义简单讲解

 

百度百科

inline函数和#define宏定义简单讲解

在C语言,实际上inline的出现是为了填补宏定义的缺点。

宏定义 是在编译器预编译的时候把define定义的关键字进行替换。

宏定义的好处是宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈代码生成等一系列的操作。

因此,效率很高,这是它在C中被使用的一个主要原因。

 

inline定义格式

1.inline定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换(像宏一样展开),没有了调用的开销,效率也很高。

2.很明显,类的内联函数也是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。

 

比如一个函数调用另一个函数:需要分配栈空间压栈执行出栈几个过程;

使用宏定义和inline可以直接在该函数代码展开执行,并无上述过程,非常高效。

 

但是使用宏定义变参有个致命的缺点,而inline则克服了该缺点,如下:

inline函数和#define宏定义简单讲解

如果不看运行结果,在我们直观程序觉得上述代码输出运算结果应该是一样的,等于6。

 

inline函数和#define宏定义简单讲解

结论:

一、首先能确定的是宏定义和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修饰只是限制该内联函数的使用的作用域,使用场景指有些编译器优化过程中会对内联函数出现警告或者错误,毕竟内联是以代码膨胀复制为代价,提高效率的。故固执的程序猿会使用强制内联函数。

 

 

全篇完。

本人博客仅仅代表我个人见解方便记录成长笔记。

若有与 看官老爷见解有冲突,我坚信看官老爷见解是对的,我的是错的。

感谢~!