inline内联函数
1.内联函数的定义:内联函数是指用inline关键字修饰的函数。如果内联函数在类体内定义,不用inline关键字声明,默认为内联函数。
2.内联函数在函数调用点展开,没有栈帧的开辟和回退。内联函数函数是在编译时直接插入函数代码的,会增加代码大小,但是可以提高运行速度。
3.内联函数不生成符号,仅可以在本文件可见。
4.如果想在其他文件使用该内联函数,可以在函数定义处加上extern关键字(不推荐)。最好将内联函数写在.h文件中。
5.inline函数和static函数和宏定义的比较:
inline
本文件可见
不产生符号
没有栈帧的开辟,在调用点展开。(debug版本下同样具有栈帧开辟和回退,方便调试。release版本下没有)
static
本文件可见
产生一个local的符号(本地符号,链接过程中不进行处理。链接处理的是global符号。)
有栈帧的开辟
宏函数
本文件可见
不产生符号
在调用点展开(预编译期)
没有类型检查
无法调试
6.内联函数和普通函数的区别:
(1)普通函数在被调用的时候,系统首先要到函数的入口地址去执行函数体,执行完成之后再回到函数调用的地方继续执行,函数始终只有一个复制;内联函数不需要寻址,当执行到内联函数的时候,将此函数展开,如果程序中有N次调用了内联函数则会有N次展开函数代码。内联函数与普通函数相比,可以加快程序的运行速度,因为不需要中断调用,在编译的时候内联函数可以直接镶嵌到目标代码中。
(2)内联函数有一定的限制,内联函数体要求代码简单,不能包含复杂的结构控制语句。如果内联函数函数体过于复杂,编译器将自动把内联函数当成普通函数来执行。
inline一般只用于如下情况:
①一个函数不断被重复调用
②函数只有简单的几行,且不包含for、while、switch等语句。
一般而言,写小程序没有必要使用inline,但是如果要完成一个工程项目,当一个简单函数被调用多次时,应考虑使用inline。
7.内联函数取代宏定义:
使用宏和内联函数都可以节省在函数调用方面所带来的时间和空间开销。二者都采用了空间换时间的方式,在其调用处进行展开。
内联函数要做参数类型检查,而宏只是简单的字符替换。这是内联函数跟宏相比的优势。
(1)宏定义不是函数, 只是在编译前(编译预处理阶段)将程序中有关字符串替换成宏体。预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率;内联函数本质上是一个函数,但在编译中不单独产生代码,而是将有关代码嵌入到调用处。
(2)内联函数在运行时可调试,而宏定义不可以。
(3)在预编译时期,宏定义在调用处执行字符串的原样替换;在编译时期,内联函数在调用处展开,同时进行参数类型检查。
(4)内联函数可以作为某个类的成员函数,这样可以使用类的保护成员和私有成员。而当一个表达式涉及到类保护成员或私有成员时,宏就不能实现了(无法将this指针放在合适位置)。即内联函数可以访问类的成员变量,宏定义不能。
可以用内联函数完全替代宏。