inline函数的总结
思维导图
1.使用方法
- 1.在函数返回类型前加Inline。成员函数可以在声明时候添加Inline也可以在定义时候添加inline。
- 2.将成员函数定义在类定义式内,这个成员函数就被隐喻为Inline。
- 3.头文件中如果想定义inline函数,必须包含定义。
内联说明对于编译器仅仅是一个建议,编译器可以忽略这个建议
下面没有加lnline的时候,机器进行编译操作
一般的函数调用,进行压栈操作,导致系统开销加大,花费了更多时间。
下面是加了inline的编程代码:
用inline修饰的函数,在编译时会在调用的内联函数地方展开,没有压栈开销。以空间为代价,提高了效率。
2.内联函数存放的位置:
放在头文件,并且声明和定义最好不要分离,不然可能出现链接错误。因为在编译过程中进行Inlineing。为了将“函数调用”替换为“被调用函数的主体”,编译器必须要直到函数长什么样的,仅仅是声明是不够的。把内联函数定义在头文件,可以确保在调用函数的时候使用的定义是相同的。
可以放在源文件中,但多个源文件的同名inline函数实现必须相同。
3.内联函数的优点:
可以避免调用函数的开销。当函数比较小的时候,内联函数可以令目标代码更加高效。对于存取函数以及比较短的执行函数。
4.内联函数的缺点:
- 1.由于内联函数将对函数的每个调用都以函数本身代替。所以会增加代码的大小。造成代码膨胀,不利于在内存不大的机器上运行。
- 2.很多编译器无法调试内联函数
- 3.inline无法随着程序的升级而升级。
5.不适用情况:
- 1.大多数编译器不支持递归函数的内联
- 2.包含循环或switch语句的内联时得不偿失的,除非在大多数情况下这些循环或switch语句不执行。
- 3.虚函数
- 所有对虚函数的调用都会使inline落空。因为虚函数意味着:等待,直到运行期才确定调用哪个函数。而调用内联函数意味着:执行前,先将调用动作替换为被执行函数的本体。由于编译器不知道调用哪个函数,导致虚函数无法使用Inline进行内联操作。
- 4.构造函数和析构函数
- 编译器会为析构函数和构造函数插入许多代码。