目录
1.宏引入
宏定义函数
宏的本质是一种替换,在预编译过程阶段,使用了宏定义函数的地方就会被替换成宏定义,所以这样的函数是不能进行调试的。也是不会建立函数栈帧的。
宏的优缺点
优点: 1.增强代码的复用性。 2.提高性能。
缺点: 1.不方便调试宏。(因为预编译阶段进行了替换)
2.导致代码可读性差,可维护性差,容易误用。
3.没有类型安全的检查 。
inline函数在release的模式下会在使用了内联函数的地方展开,会用函数体替换函数的调用,这里和宏是类似的,但不是整个函数体一字不差的替换。
默认在debug下面不会展开,就可以调试,所以他既没有建立函数栈帧的开销,同时又可以调试,他既有宏的优点,又完善了宏的缺点。
2.内联函数
inline关键字是用来定义内联函数的。
3.内联函数的特性
1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会 用函数体替换函数调用。
缺陷:代码太多,又被频繁调用,就会造成代码膨胀,程序会变得很大。
优势:少了调用开销,提高程序运 行效率。
2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建 议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不 是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性 ,即直接当成普通函数调用。
当内联函数是递归函数,或者函数内容太多,编译器会忽略内联特性。一般是10行代码以下。
4.内联函数的声明和定义不能分离
内联函数不能声明和定义分离在两个文件中,会报错。出现链接错误,建议直接放在.h文件里面。
因为inline被展开,就没有函数地址 了,链接就会找不到。
// F.h #include <iostream> using namespace std; inline void f(int i); // F.cpp #include "F.h" void f(int i) { cout << i << endl; } // main.cpp #include "F.h" int main() { f(10); return 0; }