inline函数

简介

C++关键字,在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定成内联函数。

注意

关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前面不起任何作用。

**如下风格的函数Foo 不能成为内联函数:
inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y){}
而如下风格的函数Foo 则成为内联函数:
void Foo(int x, int y);
inline void Foo(int x, int y) // inline 与函数定义体放在一起{}

引入原因

用它代替c**中表达*式形式的宏定义。
1.c中使用define,通过预处理器实现,没有参数压栈,代码生成等一系列的操作,仅仅做预处理器符号表中的简单替换,不能进行参数检测。
2.c++中引入类及类的访问控制,若一个操作或一个表达式涉及到类的保护成员或私有成员,不可使用define。
3.inline定义的类的内联函数,函数的代码被放入符号表,使用时直接替换。
4.编译器在调用一个内联函数时,首先检查它的参数的类型,保证调用正确。

编译器对inline函数的处理方法

(1)将inline函数体复制到inline函数调用点处;
(2)为所用inline函数中的局部变量分配内存空间;
(3)将inline函数的的输入参数和返回值映射到调用方法的局部变量空间中;
(4)如果inline函数有多个返回点,将其转变为inline函数代码块末尾的分支;

定义在类声明之中的成员函数将自动地成为内联函数
例:
class A
{
public:void Foo(int x, int y) { } // 自动地成为内联函数
}或:
// 头文件
class A
{
public:
void Foo(int x, int y);
}
// 定义文件
inline void A::Foo(int x, int y){}

慎用内联

内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数?
内联也就是复制代码,省去调用的开销,从而提高函数的执行效率,但如果执行函数体内代码的时间相比于函数调用的开销大,那么效率不是很高,另一方面,代码复制会消耗更多的内存空间。
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。

inline函数和普通函数的区别

1.inline函数的处理过程:在函数的调用点,将函数的代码展开,没有函数栈帧开辟回退的过程,也没有函数调用开销。
2.inline函数在debug下没有作用,只是作用域变了。
3.inline函数不能在递归函数使用。

inline函数与static关键字的区别

相同:都在当前文件中可见。
不同:static修饰的符号,在符号表中产生符号,但是符号都是local的,不受链接器处理,inline函数修饰的符号,不产生符号。

define和inline哪个好?

#define在预编译阶段直接进行字符替换,不做任何的代码安全性检查。
inline实在编译阶段处理,有完整的类型安全检查。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页