影响性能的一个重要因素是内联技巧,内联函数也可以叫内嵌函数。
在C++中,函数调用需要建立栈环境,进行参数复制,保户调用现场,返回时,还要进行返回值复制,恢复调用现场。这些工作都是与完成特定的任务操作无关的额外开销。
程序效率由于该项工作而受到影响,所以,流行的CPU都已经将函数调用的额外开销硬件化了,以此来减少额外开销。
而内联函数可以使小函数结构化和可读性,又能使效率提高。
1、对内联函数的声明必须在调用之前,因为内联函数的调用的代码在程序运行时是直接嵌套在调用执行处的,它不影响链接,只是在编译其间确实代码。因为在编译时,在调用之前看到内联声明就十分必要。
如:bool isnumber(char); 此处没有inline,不是内联函数,即使在下面定义时使用了inline,编译器还是当成普通函数来调用
inline bool isnumber(char a ){
.......................
}
2、在内联函数中,不能含有复杂的结构控制语句,如switch和while.如果内联函数含有这些语句,则编译器将无视内联声明,只是视为普通的函数那样产生调用代码。
3、递归函数也属于结构复杂的函数,也不能作为内联函数。
内联函数一般只适合于1-5行的小函数。对于一个含有许多语句的大函数,函数调用的额外开销相对来说是微不足道的,所以也没必要将函数内联。
内联函数使用的场合:
1)函数体小,这样使嵌入工作容易进行,不会破坏原调用主体。
2)程序中特别是在循环中反复执行该函数,这样会使嵌入的效率相对提高。
3)程序并不多处出现该函数调用,这样使嵌入工作量相对较少,代码量也不会剧增。
性能测试代码:
#include<iostream>
#include<time.h>
using namespace std;
int calc1(int a ,int b ){
return a+b;
}
inline int calc2(int a ,int b ){
return a+b;
}
int main(){
int x[1000],y[1000],z[1000];
clock_t t = clock();
for(int i =0;i<1000;i++){
for(int j =0;j<1000;j++){
for(int k =0;k<1000;k++){
z[i] = calc1(x[j],y[k]);
}
}
}
cout<<"not use inline:"<<(clock()-t)/CLK_TCK<<"秒"<<endl;
t = clock();
for(int i =0;i<1000;i++){
for(int j =0;j<1000;j++){
for(int k =0;k<1000;k++){
z[i] = calc2(x[j],y[k]);
}
}
}
cout<<"use inline:"<<(clock()-t)/CLK_TCK<<"秒"<<endl;
system("pause");
}