内联函数:
内联函数的编译代码与其他代码内联起来,也就是说,编译器将使用相应的函数代码代替函数调用。对于内联代码,程序无需跳转至;另一位置执行代码,再调回来。因此内联函数的运行速度比常规函数快,但代价是需要消耗很多内存的。如果程序在10个不同的地方调用同一内联函数,则该程序将包含该函数代码的10个副本。
内联函数的定义用inline
内联函数的规则:
1> 一个函数可是自己调用自己,称为递归调用,含有递归调用的函数不能设置为inline;
2> 使用了复杂流程控制语句:循环语句和switch语句,无法使用内联函数;
3> 由于inline增加体积特征,所以建议内联函数内的代码应该较小。
4> 内联函数仅作为一种“请求”,待定的情况下,编译器不会理会inline关键字,而强制让函数成为普通的函数,编译器会给出警告;
5> 在你调用一个内联函数前,这个函数一定要在之前有声明或已定义为inline,如果在前面声明为普通函数,而在调用代码后面才定义为一个inline函数,程序可以通过编译器,但是该函数没有实现inline.
函数模板:
模板是使用泛型来定义函数。通过将类型作为参数传递给模板,可是编译器生成该类型的函数。
其定义是:
emplate<class 数据类型参数标识符1,…,class 数据类型参数标识符n>
<返回类型><函数名>(参数表)
{
函数体
}
宏定义:
宏定义不能值传递。
宏定义的优点:
1>提高了程序的可读性,同时也方便进行修改;
2>提高程序的运行效率:使用带参的宏定义即可完成函数调用的功能,又能避免函数的出栈入栈操作,减少系统开销,提高运行效率;
3>宏是预处理器处理的,通过字符串操作可以完成很多编译器无法实现的功能。
宏定义的缺点:
1>由于直接侵入,所以代码可能相对多一些;
2>嵌套定义过多可能会导致程序的可读性,而且很容易出错;
3>带参的宏而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患。
预编译语句仅仅是简单的值替代,缺乏类型的检测机制。这样预处理语句就不能享受C++严格的类型检查的好处,从而可能成为引发一系列错误的隐患,
#define SQUARE(X) X*X
SQUARE(4.5 + 1.5) ---> 4.5 + 1.5 * 4.5 + 1.5
所以定义SQUARE要是
#define SQUARE(X) ((X)*(X))
eg2:
SQUARE(X++) 将X递增了两次。
宏并不是函数,宏并不是语句,宏并不是类型定义