目录
inline函数定义
使用风格
为什么要使用内联函数
内联函数的一些使用建议
inline函数定义
在函数声明或定义返回值类型前添加关键字inline即将函数指定为内联函数
inline int max(int a,int b)
使用风格
关键字inline必须放在定义体前才能将成为函数内联函数,否则不起作用
例如:
inline int max(int a, int b);
int max(){
函数体
}
为什么要使用内联函数
在我们的代码中可能经常会遇到一种场景需要大量频繁得调用函数。调用函数就会为其创建栈空间,如果频繁的调用会给内存很大的压力,消耗大量的栈空间,inline函数可以缓解这个问题。
例如下面的代码:
inline int sub(int a,int b) {
return a+b;
}
int main()
{
int i = 0;
for (i=1; i < 100; i++) {
printf("the sub is %d\n",sub(i,i+1));
}
}
?
循环 调用100次sub()函数,如果sub函数不声明为inline,系统会创建100次栈空间。但是这里我们将sub()函数声明成inline函数之后,任何调用sub()的地方都换成了"a+b",这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。
C++的”函数内联”工作方式:
1.对于任何内联函数,编译器在符号表里放入函数的声明(包括名字、参数类型、返回值类型)。 2.如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里。 在调用一个内联函数时,编译器首先检查调用是否正确(进行类型安全检查,或者进行自动类型转换,当然对所有的函数都一样)。 3.如果正确,内联函数的代码就会直接替换函数调用,于是省去了函数调用的开销。
内联函数的一些使用建议
内联函数能提高函数的执行效率,那是否任何情况下都可以使用内联函数?这是不行的。
1.内联是以代码膨胀为代价,省去了函数调用的开销,提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。所以一般在在函数频繁调用且函数内部代码很少的情况下使用。 2.每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。 3.一个好的编译器将会根据函数的定义体,自动地取消不值得的内联。
4.建议把inline函数的定义放到头文件中。在每个调用该inline函数的文件中包含该头文件。
类中的成员函数和inline?
定义在类中的成员函数默认都是内联的,如果在类定义时就在类内给出函数定义,那当然最好。如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外定义上要加上inline,否则就认为不是内联的。
例如:?
class A
{
public:
void sub(int x, int y);
}
inline void A::sub(int x, int y){
函数体
}
end?
|