inline内联函数与宏定义
我们知道,在调用函数的过程中是使用栈进行的调用,调用栈比较消耗内存,所以我们便想通过使用内联函数或者是宏定义来达到在减小内存的情况下进行函数调用的效果。
1.宏定义
宏定义是要先通过预处理的,优点是消耗内存小(比起栈方法调用函数宏定义是直接插入),缺点是宏定义的预处理只是简单地文本置换(可能会出现如下代码的问题)。
#include <iostream>
#define SUM 3+4
using namespace std;
int main() {
cout << SUM * SUM << endl;
return 0;
}
结果本应该是49,可是由于宏定义是进行的简单地进行文本替换,也就变成了
3+4*3+4 = 19
2.内联函数
想要减小内存的开销,又想避免宏定义容易出现的问题,那么内联函数就是一个不错的选择。
内联函数是在通过编译器进行判断的,加上inline 只是给编译器一个建议,让编译器考虑把该函数改成内联函数,但是如果函数本身过于复杂,就算加上了inline,编译器也不会将函数改为内联的。
放在类中的函数编译器都默认加上inline
class Base {
public:
//构造函数
Base() {}
//析构函数
~Base() {}
//声明f函数
void f() {
cout << "This is function f" << endl;
}
};
内联函数的使用方法
- 直接在类中定义好函数,让编译器帮忙加上inline.
class Base {
public:
//构造函数
Base() {}
//析构函数
~Base() {}
//声明f函数
void f() {
cout << "This is function f" << endl;
}
};
- 一般来说会将头文件和源文件分开写,当函数在类中声明不加liline,在类外定义时需要加inline,因为在类外编译器无法判断这个函数是否是内联。
class Base {
public:
//构造函数
Base() {}
//析构函数
~Base() {}
//声明f函数
void f() {}
};
//定义f函数
inline void Base::f() {
cout << "This is function f" << endl;
}
- 注意:在Head.h文件,也就是头文件中必须直接定义内联函数,而不能是先在头文件中申明,再在Head.cpp文件中实现,因为内联函数是像宏定义一样将整个语句代入,所以不能分开写。
Head.h
#ifndef _HEAD_H_
#define _HEAD_H_
#include<iostream>
inline int add (int a, int b){
return a+b;
}
#endif
总结
内联函数可以说是继承了普通函数与宏定义的优点,摒弃了缺点:不像普通函数那样消耗内存,又比宏定义更加规范准确
- 不像普通函数一样调用堆栈消耗内存,而是采用类似于宏定义的直接写入。
- 比宏定义更加规范,不像宏定义那样容易出错。