函数调用有参数压栈、生成汇编语言的CALL、返回参数、执行汇编语言的RETURN等开销。
内联函数能够像普通函数一样具有我们所期望的任何行为,唯一不同之处是内联函数在适当的地方像宏一样展开,所以不需要函数调用的开销。
任何在类中定义的函数自动地成为内联函数,但也可以在非类的函数前加上关键字inline使之成为内联函数(必须使函数体和声明结合在一起,否则编译器将之视为普通函数)。
一般应该把内联函数放在头文件中,当编译器看到这个定义时,它把函数类型(函数名+返回值)放在符号表里,当编译器看到内联函数和对内联函数体的进行分析没有发现错误时,就将函数体(代码是以源程序形式存放还是编译过的汇编指令形式存放取决于编译器)也放入符号表。调用内联函数时,编译器检查以确保调用和返回值是正确的,然后将函数调用替换为函数体,因而消除了开销。
注意,使用内联函数的目的是减少函数调用的开销,但是,假如函数较大,就不适宜定义为内联函数(由于需要在调用函数的每一处重复复制代码,这样将使代码膨胀,在速度方面获得的好处就会减少)。一般地,任何种类的循环都被认为太复杂而不扩展为内联函数。假如要显示地或隐式地取函数地址,编译器也不能执行内联(因为这时编译器必须为函数代码分配内存从而产生一个函数地址,但当地址不需要时,编译器仍将内联代码)。
C++语言规定:只有在类声明结束后,其中的内联函数才会被计算。所以,当一个内联函数在类中向前引用一个还没有声明的函数时,编译器是可以处理的。
注意:定义一个友元函数为内联函数不会改变友元状态,而且它仍是全局函数而不是一个类的成员函数。