使用宏和内联函数都可以节省在函数调用方面所带来的时间和空间开销。二者都采用了空间换时间的方式,在其调用处进行展开:
- 在预编译时期,宏定义在调用处执行字符串的 原样 替换。在编译时期,内联函数在调用处展开,同时进行函数类型检查。
对比宏的缺陷,内联函数的优点:
- 内联函数遵守强加给函数的所有规则和类型安全,这可以避免将意外或非法的参数作为实参来传递它。
- 定义内联函数的语法和其他函数相同,只是在函数声明中使用关键字inline。
- 将表达式作为实参传递给内联函数时,将在进入函数体之前被计算,因此只被计算一次。传递给宏的表达式可能被计算多次,从而导致不安全和意外的副作用。(宏#define square(x) (x*x) ,执行square(1+2),结果为5)
- 可以使用调试器对内联函数进行调试;而对于宏而言是不可能的,因为宏将在分析程序接手前和符号创建前被扩展。
- 内联函数可以提高程序的可读性和可维护性,因为他们使用的语法和常规函数调用相同,而且不会意外地修改参数。
何时使用内联函数:
- 小型方法,如私有数据成员的存取函数
- 返回对象状态信息的函数
- 小型函数,通常不超过3行
- 不断被 调用的小型函数