C++ inline和define(宏)
文章目录
- Inline 函数是什么意思?
- C++中哪些函数不能声明为inline?
- 内联(inline)函数和 #define(宏)
Inline 函数是什么意思?
inline是内联的意思,可以定义比较小的函数。因为函数频繁调用会占用很多的栈空间,进行入栈出栈操作也耗费计算资源,所以可以用inline关键字修饰频繁调用的小函数。编译器会在编译阶段将代码体嵌入内联函数的调用语句块中。
C++中哪些函数不能声明为inline?
- 包含了递归、循环等结构的函数一般不会被内联。
- 虚拟函数一般不会内联,但是如果编译器能在编译时确定具体的调用函数,那么仍然会就地展开该函数。
- 如果通过函数指针调用内联函数,那么该函数将不会内联而是通过call 进行调用。
- 构造和析构函数一般会生成大量代码,因此一般也不适合内联。
- 如果内联函数调用了其他函数也不会被内联
- inline在类体中和类外定义成员函数是有区别的,在类体定义的成员函数为inline函数,在类外定义的不是。
- 用static修饰的inline函数,本限定在本源码文件中,不能被本源码文件以外的代码文件调用,隐藏的作用,所以内联函数是可以被static修饰,但是inline函数内调用static函数会不展开
内联(inline)函数和 #define(宏)
- 在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换。
- 内联函数在运行时可调式,宏定义不可以
- 内联函数可以访问类的成员变量,宏不可以
- 类中的成员函数是默认的内联函数
- 内联函数在编译时展开,而宏在预编译时展开
- 宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。
- 宏是 由预处理器对宏进行替换 的,而内联函数是 通过编译器控制实现 的,更加安全,而不是单纯的替换
- 编译时,在调用处用内联函数体的代码来替换,这样没有函数压栈,将会节省调用的开销,提高运行效率(以空间换时间)