内联函数与宏定义
我们知道,在调用函数的过程中是使用栈进行的调用,调用栈比较消耗内存,所以我们便想通过使用内联函数或者是宏定义来达到在减小内存的情况下进行函数调用的效果。
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;
}
来源:CSDN
作者:Worthy_Wang
链接:https://blog.csdn.net/Worthy_Wang/article/details/103568699