内联函数(inline)

1、什么是内联函数?

    内联函数的实质就是任然是函数,只不过是在定义普通函数的时候,添加了一个inline关键字声明。

2、内联函数有什么用?

    C语言或者C++中,在调用函数的时候,都会将函数的参数、内部变量、返回值都会用栈来保存,如果一个函数反复频繁的被调用,那么这个压栈出栈的过程就会被重复调用,而压栈出栈都是会耗费时间的,所以出现了内联函数:以空间换时间,也就是说内联函数在语法上和函数是一模一样的,只不过是在调用的时候,直接将函数体和函数调用语句替换,这样就不牵涉到函数调用过程了。

3、内联函数怎么用?

    只能在函数定义的位置添加inline关键字声明,不能将inline添加到函数的声明中。

    一般最好将内联函数定义在.h头文件中,这和宏定义类似,只要使用到内联函数的时候,包含下头文件就可以省去再次定义的麻烦了。

4、内联函数注意事项?

    内敛函数只是对编译器的建议,也就是说到底能不能以内联函数的方法使用该函数,关键看编译器采纳不采纳将这个inline定义的函数按照内敛函数的形式编译的建议,那么编译器采纳建议的标准就是:只要能够提高程序执行效率就可以,那为了满足这个要求,需要注意:

    (1)内联函数结构不能太复杂

        因为内联函数是以牺牲内存来换取程序执行时间的缩短(省去调用函数过程,直接拷贝代码),如果函数体太庞大,这样编译成的程序指令就比较冗余,浪费内存。

    (2)不能出现复杂的结构控制语句例如while、switch、if、for,同时内联函数不能为递归。

        这个其实是内联函数规定的,内联函数出现的目的就是为了节省函数执行时间(效率).

        不是内联函数中不能有循环语句,而是当内联函数中出现了复杂的逻辑控制语句后,编译器会不再认为它是一个内联函数。

也就是说,当内联函数中实现过于复杂时,编译器会将它作为一个普通函数处理。

        这是由内联函数的特殊性所决定的,由于内联是调用处展开的方式,所以编译器认为只有足够简单的函数才可以具有该特性,复杂函数编译器会放弃内联特性。

5、内联函数和宏定义区别?

     内联函数的实质是函数,宏定义的实质是字符串替换。虽然宏定义和内联函数都是替换但是还是有些区别的:

    (1)宏定义的替换发生在预处理阶段,内联函数的替换是在编译阶段

    (2)宏定义在不好直观阅读代码,而且语法上容易出现错误(少符号、传递表达式),但是内联函数则是完全按照函数规则

6、总结

    一句话,内联函数起始就是在编译的时候建议编译器在遇见inline声明的函数的时候,先看看该函数是否满足内联函数的规则要求:不包含复杂逻辑结构(switch、if、while、for)和庞大代码的函数体,满足的话就将其按照内联函数方式编译(不调用函数,而是直接替换函数体内代码),不满足就按照普通函数编译。

猜你喜欢

转载自blog.csdn.net/CSDNmianfeixiazai001/article/details/80479789
今日推荐