宏不会被编译,因为在源码进入编译器之前,他会被预处理器去掉,因此尽量用const代替。
宏不是函数,只是在编译前预处理阶段将程序中有关字符串替换成宏体。因此要注意下列代码中的问题:
int a = 5, b = 0;
max(++a, b);// a 的值增加了2次
max(++a, b+10); // a 的值只增加了1次
相比之下内联函数实现了宏的效率,但在编译中不单独产生代码,而是将有关代码嵌入到调用处。
inline max(int a,int b)
{
return a>b?a:b;
}
inline定义的内联函数,函数代码被放入符号表中,在使用时进行替换(像宏一样展开),效率很高。类的内联函数也是函数。编绎器在调用一个内联函数,首先会检查参数问题,保证调用正确,像对待真正函数一样,消除了隐患及局限性。inline可以作为类的成员函数,可以使用所在类的保护成员及私有成员。
内联函数和普通函数相比可以加快程序的运行速度,但它是以增加程序存储空间为代价的,由于不需要中断调用,在编译内联函数的时候内联函数可以直接被嵌入目标代码中。
内敛函数的缺点:
1)如果函数的代码较长,使用内联将消耗过多内存。
2)如果函数体内有循环,那么执行函数代码时间比调用开销大。