overhead:额外的开销,总的开销 。
int f(int i){
return i*2;
}
main(){
int a=4;
int b=f(a);
}
调用函数的额外的步骤:
-
将参数压入栈中
-
将返回地址压入栈中
-
准备返回值
-
取出所有被压入栈中的值
使用内联函数可以省略以上步骤:如果一个函数是内联函数,不会需要以上的步骤,在调用函数时将函数代码放到调用它的地方,且还能保持函数的独立性。
int f(int i){
return i*2;
}
main(){
int a=4;
int b=f(a);
}
//相当于
main(){
int a=4;
int b=a+a;
}
内联函数不会出现在最终形成可执行文件里,只会出现在编译器里,不产生.o文件。
inline在.h(给调用的地方看)和.cpp(产生函数)里都必须写inline
inline int plusOne(int x);
inline int plusOne(int x){return ++x;};
a.h
#include <iostream>
using namespace std;//一般不加,取决于.h内的内容
inline void f(int i,int j);//如果删掉声明,会报错,重复定义
inline void f(int i,int j){//不加body部分会报错,这个其实也是一个声明
cout<<i<<" "<<j<<endl;
}
a.cpp //使用内联函数其实可以省略.cpp文件,有.h和mian.cpp就够了
#include "a.h"
#include<iostream>
using namespace std;
inline void f(int i,int j){
cout<<i<<" "<<j<<endl;
}
main.cpp
#include "a.h"
int main(){
f(10,10);
return 0;
}
vi a.h 打开a.h
vi a.cpp 打开a.cpp
vi main.cpp打开main.cpp
g++ main.cpp a.cpp编译运行
g++ main.cpp a.cpp --save-temps 留下刚刚的结果
main.s 汇编指令
more main.cpp 展示main.cpp代码
./a.out 运行
g++ a.cpp -m32 编译成32位
内联函数:空间换时间,占用内存,但是额外开销少了
C的宏的问题不可以做类型检查,而内联函数则可以做内联检查
#indefine f(a) (a)+(a)
main(){
double a=4;
printf("%d",f(a));//会报错,浮点数不能用%d
}
inline int f(int i){
return i*2;
}
main(){
double a=4;
printf("%d",f(a));//会提示改%d,或者强制类型转换为Int
}
如果inline函数过于巨大(递归一定不可以inline),则编译器可能会拒绝Inline;函数很小,会被编译器自动inline
成员函数在构造时写body,则其为inline函数。
#include<string>
using namespace std;
class Point{
int i,j,k;
public:
Point(){i=j=k=0;}//内联函数
Point(int ii,int jj,int kk){i=ii,j=jj,k=kk;}//内联函数
void print(string& msg=" "){//内联函数
if(msg.size()!=0) cout<<msg<<endl;
cout<<"i="i<<","<<"j="<<j<<","<<"k="<<k<<endl;
}
};
int main(){
Point p,q(1,2,3);
p.print("value of p");//不是真的调用函数,而是将代码插入
q.print("value of q");//不是真的调用函数,而是将代码插入
}
class Cup{
int color;
public:
int getColor(){return color;}
void setColor(int color){
this->color=color;
}
};//将set get函数写成内联函数,调用时它们时相当于直接访问color,从运行效率来看没有区别
class Rectangel{
int width,height;
public:
Rectangle(int w=0,int h=0);
int getWidth() const;
void setWidth(int w);
int getHeight() const;
void setHeight(int h);
};
inline Rectangle::Rectangle(int w,int h):width(w),height(h){}//内联函数,在.h里,而不是在.cpp里,在declaration里,而不在definition
inline int Rectangle::getWidth() const{
return width;
}
inline:
-
函数很小,两三行
-
频繁调用的函数,如在循环里调用
not inline
-
非常大的函数,超过20行
-
递归函数