Inline 关键字:修饰内联函数
内联函数的使用主要是为了使编译器在编译阶段就能够将内联函数直接通过该处的调用直接将代码插入进去;不用像普通函数一样,先进行编译,然后在调用的时候再通过栈操作,先保存当前的代码段地址->转到该函数的定义->调用函数->执行->ret->返回原有段地址,继续执行主函数。
Attention:
- 内联函数的在类中的使用表现,通常是采用直接在类内方法声明的时候进行实现的。例如:
@Example
class Solution{
public:
int max(int a, int b){
return a<b?b:a;
}
}
- 而对于普通的内联函数而言,通常是使用
inline
关键字添加在函数的实现阶段的。
注意:- 就
inline
来说,只有在函数实现的时候添加才能够被编译器识别为内联函数,如果在函数声明的阶段引用该关键字,则编译器并不能将其识别为内联函数。
- 就
-
inline
关键字本质上是一个是实现修饰符,而非声明修饰符,所以应该用于函数实现部分的修饰(也可以放置inline在声明,但是没有必要)。
例如:
@Example
//仅在函数声明的时候添加关键字**inline**,这种情况无法被识别为内联函数
inline void swap(int &a, int &b);
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
而如果在函数实现的时候添加关键字则情况就不一样了,例如:
@Example
//在函数实现的时候添加关键字**inline**,有效,被识别为内联函数
void swap(int &a, int &b);
inline void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
- 对于类内定义的内联函数,在编译阶段,编译器会将这段代码直接插入到制定的调用位置中,所以在内联函数短小精悍的情况下,会有效提升整体程序的运行效率,避免了在运行阶段反复进行调用。但需注意以下几点:
- 内联函数的实现必须保证代码内容小而高效,若代码段过长而又强行被定义成了内联函数(包括类内实现的方法和inline修饰的函数),则编译器会默认将其不识别为内联函数,否则会极大地影响程序的运行效率。
- 用inline修饰只是建议编译器对函数使用内联。而至于真的是否被定义为内联函数,由编译器视函数的实际情况来决定。如果函数过长很多,或函数中有循环,条件判断等语句,编译器一般不会将其识别为内联。
- 如果内联函数的使用在内联函数定义之前,也不会内联。