1.#define 是文本替换。
#define 是一个预处理器指令,用来创建宏定义。它可以定义符号常量、简单的函数或执行其他形式的文本替换。一般用于定义宏(macro),主要有两种用途:
1.定义常量
2.创建宏函数
无论哪种都是用于在编译时替换文本,也就是 define 实际上只是做文本的替换。
2.#inline是一个函数定义关键字
内联函数(inline function)和普通函数(regular function)之间的主要区别在于它们的实现方式及其对性能的影响。下面是一些关键的不同点:
2.内联函数(Inline Function)
inline 是一个关键字,用于提示编译器尽可能地将函数体直接嵌入到调用点处,而不是执行常规的函数调用。
-
定义与声明:
- 内联函数通常在函数定义前加上
inline
关键字,表明该函数可以被内联展开。 - 内联函数可以在头文件中定义,这样在多个编译单元中使用时不会产生重复定义的错误。
- 内联函数通常在函数定义前加上
-
调用机制:
- 当编译器遇到内联函数调用时,它会尝试将函数体直接嵌入到调用点的位置,而不是执行传统的函数调用机制(跳转到函数地址、传递参数、返回等)。
- 这种替换过程称为内联展开(inlining),可以减少函数调用的开销,提高程序的执行效率。
-
性能影响:
- 内联函数可以减少函数调用的开销,从而提高执行速度。
- 但是,内联函数会增加生成的目标代码大小,因为每次调用的地方都会嵌入函数体,可能导致更大的二进制文件。
-
适用场景:
- 内联函数适用于那些频繁调用但执行速度快的小函数。
- 对于大型函数,内联展开可能会导致代码膨胀,反而降低性能。
-
最终决定权:
- 虽然开发者建议使用
inline
关键字,但是否真的内联是由编译器决定的。编译器可能会基于函数的大小、调用频率等因素来决定是否内联。
- 虽然开发者建议使用
- 内联函数通常用于小型、频繁调用的函数,可以减少函数调用开销,但会增加代码大小。
- 普通函数适用于大型函数或不频繁调用的情况,虽然有一定的调用开销,但不会显著增加代码大小。
在实践中,选择使用内联函数还是普通函数取决于具体的应用场景和性能需求。现代编译器通常具有优化功能,可以在适当的时候自动内联函数,即使没有显式地使用inline
关键字。
3.typedef:已存在类型的别名
typedef 是一种类型定义关键字,用于为现有类型创建新的名称(别名)。与宏定义不同,typedef 是在编译阶段处理的,有更严格的类型检查。