overhead of function call
- push parameter
- push return address
- prepare return values
- pop all pushed
内联函数inline, 省去了overhead的时间,是一种以空间换取时间的策略
当调用内联函数时,只是将函数代码嵌入到调用的地方。其他的检查参数步骤都存在。
inline需要在 .h和.cpp 处重复出现。(.h 是给调用该函数的地方看的,而.cpp 是给编译器看的)
// a.h
inline void f()(int i, int j);
// a.cpp
#include "a.h"
#include<iostream>
inline void f(int i, int j) {
cout << i << " " << j << endl;
}
// main.cpp
#include "a.h"
int main(){
f(10, 0);
return 0;
}
在链接阶段会报错,编译会有warning
需要将 f函数的body放入 a.h中
// a.h
#include<iostream>
using namespace std;
inline void f()(int i, int j);// 这句话可以不需要了,因为body放在这里了
inline void f(int i, int j) {
cout << i << " " << j << endl;
}
// a.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, 0);
return 0;
}
当函数加了inline后 函数的定义就不再是定义,而是声明。所以内联函数不需要对应的.cpp
与c的宏区别
c的宏没有参数检查
而内联有参数检查
如果inline函数过于复杂,或者拥有递归(则编译器会拒绝inline
成员函数
在class中的使用,可以直接在class里面定义函数体,也可以使用inline关键字
- 从运行效率来看,这类没有多余的开销,和直接访问数据的效率一样
- 保持类里面的整洁
inline or not
两三行函数的可以考虑
频繁调用的函数值得做成inline 省掉overhead
超过20行的not
46840274610)]
inline or not
两三行函数的可以考虑
频繁调用的函数值得做成inline 省掉overhead
超过20行的not
有递归的not