1.内联函数
1.1什么是内联函数
内联函数是c++的增强特性之一,用以提高程序运行速度所做的改进。当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。谈及内联函数我们首先需要知道常规函数调用过程。我们都知道编译过程的最终产物是可执行程序,程序运行时,操作系统将指令再如计算机内存,每条指令都有特定的内存地址,计算机然后又逐步执行指令,当程序执行到常规函数调用时,程序会跳转到函数地址,在函数调用结束后返回,更加详细来说就是程序执行到函数调用指令时,程序会在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈中,跳转到函数内存地址并执行函数代码,当执行结束后跳转回原来保存的地址处。这样来回跳转并进行参数复制会降低程序运行的速度。
因此内联函数提供的选择是将编译代码与其他程序代码“内联”起来,编译器在使用函数代码直接代替函数调用(这种替换行为发生在编译阶段而非程序运行阶段),对于内联函数,程序不需要跳转执行代码,没有函数压栈的开销,因此程序运行速度会稍快,但是会占用更多的内存空间。
1.2选择使用内联函数
使用原则:
1.定义函数时,在函数的最前面以关键字inline声明函数,即可使函数称为内联声明函数。
2.内联函数的定义性声明应该出现在对该函数的第一次调用之前。
3.内联函数首先是函数,函数的很多性质都适用于内联函数,如内联函数可以重载。
4.内联函数体中,不能有循环语句、if语句或switch语句,否则,函数定义时即使有inline关键字,编译器也会把该函数作为非内联函数处理。
值得注意的是,内联函数仅仅是对编译器的内联建议,编译器是否觉得采取你的建议取决于函数是否符合内联的有利条件。如果函数体非常大,那么编译器将忽略函数的内联声明,而将内联函数作为普通函数处理。
使用实例:
1.3内联函数优缺点
优点:
-
它通过避免函数调用所带来的开销来提高你程序的运行速度。
-
当函数调用发生时,它节省了变量弹栈、压栈的开销。
-
它避免了一个函数执行完返回原现场的开销。
-
通过将函数声明为内联,你可以把函数定义放在头文件内。
缺点:
-
因为代码的扩展,内联函数增大了可执行程序的体积。
-
C++内联函数的展开是在编译阶段,这就意味着如果你的内联函数发生了改动,那么就需要重新编译代码。
-
当你把内联函数放在头文件中时,它将会使你的头文件信息变多,不过头文件的使用者不用在意这些。
-
有时候内联函数并不受到青睐,比如在嵌入式系统中,嵌入式系统的存储约束可能不允许体积很大的可执行程序。
1.4内联函数与宏
inline是c++新增的特性,在c语言中是使用预处理器语句#define来提供宏——内联代码的原始实现,宏并不是通过传递参数实现的,而是通过文本替换来实现的。
这里的b结果明显是错误的,这就是因为宏不能够按照值传递,只是进行简单的文本替换。
inline函数和宏的区别
- inline 在编译阶段进行参数类型检查和安全检查,宏处理在预编译期间,不进行参数类型检查和安全检查。
- inline是一种更安全的宏。
1.5内联函数补充
类中的内联函数:定义位于类声明中的函数都将自动成为内联函数