内联函数
目的:代替宏函数的
内联函数的引出——宏函数的缺陷
宏函数的缺陷
case 1:
//定义一个加法
#define MyAdd(x,y) ((x)+(y))
void test18() {
int ret = MyAdd(10, 20) * 20;//预期600,实际是410,加括号可以处理
cout << ret << endl;
}
case 2:
#define MyCompare(a,b) ((a)<(b))?(a):(b)
void test19() {
int a = 10;
int b = 20;
int ret = MyCompare(++a, b);//预期11结果12(两次++a)
cout << ret << endl;
}
case 3:
宏函数没有作用域
内联函数
inline void myCompare(int a, int b) {
int ret = a < b ? a : b;
cout << ret << endl;
}
void test20() {
int a = 10;
int b = 20;
myCompare(++a, b);//11
}
内联函数注意事项
类内部的成员函数默认加inline关键字
inline void func();//内联函数声明
inline void func() {};//如果函数实现时没有加inline关键字就不算内联函数
内联函数的确占用空间,但是内联函数相对于普通函数的优势只是省去了函数调用时候的压栈、跳栈、返回的开销。我们可以理解为以空间换时间。
成员函数默认加inline关键字为内联函数
内联函数有一些限制,以下情况不会进行内联编译:
1.不能存在任何形式的循环语句;
2.不能存在过多的条件判断语句;
3.函数体不能过于庞大;
4.不能对函数进行取址操作。
内联函数 解决宏缺陷问题
给编译器一个建议 加上关键字 编译器不一定按照内联处理
不加关键字 也许会自动加inline
成员函数 默认加上关键字 加上也不一定按内联处理