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