有别于C语言,C++新特性包括内联函数、按引用传递变量、默认的参数值、函数重载(多态)以及模板函数
1. 内联函数是C++为提高程序运行速度而改进的。
2. 常规函数和内联函数的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中。
程序代码先编译后运行。
① 编译过程的最终产品是可执行程序,它是由一组机器语言指令组成的。
② 运行程序时,操作系统将这些指令载入到计算机内存中。因此,每条指令都有特定的内存地址。计算机随后将逐步执行这些命令。当遇到循环或分支语句时,将跳过一些指令,向前或向后跳到特定地址。常规函数调用也使程序跳到调用函数的地址,并在函数结束时返回。
常规函数的运行过程:执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码,然后跳回到地址被保存的指令处。来回跳跃并记录跳跃位置意味着使用常规函数时,需要一定的开销。
内联函数:无需跳转,速度较快。
① 内联函数使用内联代码替换函数调用。对于内联代码,程序无需跳到另一位置处执行代码,再跳回来。因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。
② 应有选择性地使用内联函数。若执行函数所需时间长于处理函数调用,则使用内联函数节省的时间很少;若执行函数所需时间很短,则使用内联函数会节省大部分时间。另一方面,由于这个过程相当快,因此尽管节省了该过程的大部分时间,但节省的时间绝对值并不大。除非该函数经常被调用。
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来提供宏。
宏不能按值传递。
如果使用了C语言的宏功能,应考虑将它们转换为C++内联函数。
联系客服