有别于C语言,C++新特性包括内联函数、按引用传递变量、默认的参数值、函数重载(多态)以及模板函数 1. 内联函数是C++为提高程序运行速度而改进的。 2. 常规函数和内联函数的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中。 程序代码先编译后运行。 ① 编译过程的最终产品是可执行程序,它是由一组机器语言指令组成的。 ② 运行程序时,操作系统将这些指令载入到计算机内存中。因此,每条指令都有特定的内存地址。计算机随后将逐步执行这些命令。当遇到循环或分支语句时,将跳过一些指令,向前或向后跳到特定地址。常规函数调用也使程序跳到调用函数的地址,并在函数结束时返回。 常规函数的运行过程:执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码,然后跳回到地址被保存的指令处。来回跳跃并记录跳跃位置意味着使用常规函数时,需要一定的开销。 内联函数:无需跳转,速度较快。 ① 内联函数使用内联代码替换函数调用。对于内联代码,程序无需跳到另一位置处执行代码,再跳回来。因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。 ② 应有选择性地使用内联函数。若执行函数所需时间长于处理函数调用,则使用内联函数节省的时间很少;若执行函数所需时间很短,则使用内联函数会节省大部分时间。另一方面,由于这个过程相当快,因此尽管节省了该过程的大部分时间,但节省的时间绝对值并不大。除非该函数经常被调用。
图8.1 内联函数与常规函数3. 使用内联函数 遵循下述规则之一: ① 在函数声明前加上关键字inline;② 在函数定义前加上关键字inline。 通常的做法是省略原型,将整个定义放在本应提供原型的地方。 使用内联函数时应避免函数过大。当函数过大时,编译器可能不会将函数视为内联函数。 内联函数不能递归。
4. 通过内联函数 square() 来计算参数的平方。 #include <iostream>
using namespace std;
inline double square(double x) {return x * x;}
int main(void)
{
double a, b;
double c = 13.0;
a = square(5.0);
b = square(4.5 + 7.5);
cout << "a = " << a << ", b = " << b << endl;
cout << "c = " << c << ", c square = " << square(c++) << endl;
cout << "Now, c = " << c << endl;
return 0;
} 编译输出: a = 25, b = 144
c = 13, c square = 169
Now, c = 14 5. C语言使用预处理器语句#define来提供宏。
|