要说内联函数,则免不了与宏定义对比:
最初,宏定义完成简单的代码替换。
但C++出现后,宏定义不能享受C++编译器类型检查的好处。
同时,宏定义不能使用this指针。
所以,出现了内联函数,内联函数检查参数类型,但也采用像宏一样的展开,没有了函数栈调用开销,效率高。
内 联 和 宏 区 别 : {\orange{内联和宏区别:}} 内联和宏区别:
-
内联在编译时展开,宏在预编译时展开
-
内联检查类型检测,语句合理性,宏不具有
内 联 函 数 使 用 最 多 的 场 景 是 定 义 存 取 函 数 {\red{内联函数使用最多的场景是定义存取函数}} 内联函数使用最多的场景是定义存取函数
但是,
-
如果函数内代码较长,则不适合改为内联函数,较长的代码替换会降低效率。
-
如果函数内存在循环,则不适合改为内联函数,相比循环开销,函数栈开销基本忽略不计。
-
不要随便将构造函数和析构函数改为内联。
虚 函 数 不 能 声 明 为 i n l i n e : {\red{虚函数不能声明为inline:}} 虚函数不能声明为inline:
其实,在Apple clang中是 可 以 {\green{可以}} 可以的,也许编译器优化取消了inline?
理论上,inline与virtual是 不 能 共 存 {\blue{不能共存}} 不能共存的。
内联在编译期间,对调用内联的地方替换成目标函数。
虚函数实现运行时多态,在运行时通过this指针决定函数。
宏 定 义 与 t y p e d e f : {\green{宏定义与typedef:}} 宏定义与typedef:
typedef 有作用域,有类型检查,只用来设置类型别名。
宏定义可以定义、常量、变量、简单函数、编译开关等。