宏定义和内联函数的区别
相同的目的
节省频繁的函数调用过程中产生的时间和空间开销,提高程序执行效率
宏定义 | 内联函数 |
---|---|
字符串替换,不是函数 | 函数 |
在预处理阶段展开 | 在编译阶段展开 |
/ | 作为类成员时,可以访问类的所有成员,包括this指针 |
/ | 完全可以替代宏定义,有益于程序可读性和安全性 |
/ | 代码膨胀问题 |
代码膨胀
- 当内联函数体非常庞大,并且在多处调用,代码展开后的内联函数就会内嵌到程序各处,也就造成了代码体积的极度膨胀。
- 要确保内联函数体的简单
宏函数和内联函数的使用
宏函数不是函数
宏函数的使用示例:
#define OUTINT(x) cout<<"INT:"<< x <<endl;
#define OUTCHAR(x) cout<<"CHAR:"<< x <<endl;
void out()
{
int i = 10;
char c = 'A';
OUTINT(i);
OUTCHAR(c);
}
内联函数的例子:
class Rectangle{
private:
int length;
int width;
public:
Rectangle(int,int);
int getSquare();
int getGirth(){
return 2*(length + width);
}
}
Rectangle::Rectangle(int l,int w):length(l),width(w){}
inline int Rectangle::getSquare(){
return length*width;
}
Rectangle 类将 getSquare 函数通过 intline 关键字定义为内联函数,在函数声明时使用 intline 起不到任何作用,一定要在定义时使用
在编译阶段,编译器在发现 intline 关键字时会将函数体保存在函数名所在的符号表内,在程序调用内联函数的地方,编译器直接在符号表中获取函数名和函数体,并用内联函数的函数体替换掉函数调用,从而节省了运行时函数调用的开销
如果在函数声明的同时给出函数定义,编译器会自动将函数识别为内联函数。(不推荐使用)
宏函数中的展开错误
#define MAX(a,b) a > b ? a:b
#define MUL(a,b) a * b
int main()
{
int x = 4,y = 2;
int max = MAX(++ x,y);
int mul = MUL(x,y + 2);
cout <<"the max is"<< max << endl;
cout <<"the mul is"<< mul << endl;
return 0;
}
输出结果(修改前):
the max is 6
the mul is 14
展开后
int max = ++ x > y ? ++ x: y ; //x 为 6
int mul = x * y + 2; //6*2+2 = 14
修改代码:
#define MAX(a,b) (a) > (b) ? (a):(b)
#define MUL(a,b) (a) * (b)
输出结果(修改后):
the max is 6 //在三目运算符仍然要加两次
the mul is 24