宏定义函数的优缺点
函数调用
会带来额外的开销,它需要开辟一片栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈,这种开销不仅会降低代码效率,而且代码量也会大大增加。
使用宏定义则在代码规模和速度方面都比函数更胜一筹,其次,函数的参数必须被声明为一种特定的类型,所以它只能在类型合适的表达式上使用,我们如果要比较两个浮点型的大小,就不得不再写一个专门针对浮点型的比较函数。(宏定义不检查类型,即是有点也是缺点: 宏不能访问对象的私有成员、 宏的定义很容易产生二意性。)
内联函数和函数模板
C++
模板函数可以解决类型单一,实现泛型编程;内敛函数可以内敛函数一般规模较小,程序再调用这些成员函数时,是把函数代码嵌入程序的调用点(内敛函数在源文件中不是调用而是按原样展开),这样可以大大减少调用成员函数的时间。事实上我们可以用内联函数完全取代预处理宏。
// [1] 宏,类型不用声明 优点:类似于模板 可以int、double
#define getMax(a, b) (a > b ? a : b)
// [2] 函数 声明为int, 只能比较(11, 13) 不能比较(3.14, 6.18)
int f_getMax(int a, int b) {
return a > b ? a : b; }
// [3] C++ 模板函数, 有类型推导
template <typename T