C++中inline和#define的区别总结

2023-11-26 15:06:55 浏览数 (1)

在C 中,inline 和 #define 都用于代码优化,但它们的实现方式和功能有所不同。

inline

inline 是一个函数修饰符,在函数定义前加上该关键字可以告诉编译器将该函数内联展开。也就是说,编译器会将调用这个函数的地方直接替换为这个函数体的内容。因此使用 inline 可以减少程序运行时的调用开销,并提高程序效率。

需要注意的是,对于一些过大或者复杂度较高的函数来说,并不一定能够真正地被内联展开。此外,在某些情况下(如递归),也不能使用 inline 修饰符。

#define

#define 是一个预处理指令,在编译阶段对代码进行文本替换。通过 #define 定义常量、宏等可以简化代码并且提高可读性。

例如:

代码语言:txt复制
c
Copy code
#define PI 3.1415926
double area(double r)
{
    return PI * r * r;
}

在预处理之后,以上代码会变成:

代码语言:txt复制
c
Copy code
double area(double r)
{
    return 3.1415926 * r * r;
}

需要注意的是,由于 #define 是文本替换而非类型安全操作, 因此可能导致意料之外 的错误发生.

综上所述:

  • 使用 inline: 在想要让编译器内联函数的地方使用该关键字,对于中小型、简单且频繁调用的函数可以提高程序效率。
  • 使用 #define: 在需要定义常量或宏等时使用。但是要注意在使用前进行检查和验证, 避免引入不必要的错误. 总结来看:
  • 处理阶段: 宏定义define在预处理阶段就换成了字符串的替换,而inline在编译阶段进行。
  • 类型安全检查: 宏定义define是简单的字符串替换,不存在类型安全检查,而inline函数还是一个函数,编译器会进行类型安全检查,因此inline更加安全。
  • 替换方式: 宏定义define只是单纯的字符串替换,而inline是代码嵌入,也就是说编译器在函数调用的地方直接将inline函数代码写进去,这样就不会产生函数的调用跳转(无栈帧消耗) ,因此适用于短小的函数,并且安全可靠。
  • 使用方式: 宏定义define只要定义了就会替换,而inline只是建议,编译器可以拒绝替换,在函数较大的时候,编译器可以选择不展开相应的函数。

最后还要提醒一点:inline关键字必须在函数定义处,位于函数声明处则无效,因此一般将公共的inline函数的定义写在头文件中。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞