关键字inline修饰的函数就是内联函数,inline必须与函数的定义体放在一起才能使函数称为内联,而将inline放在函数的声明之前是不起作用的。
inline和static两个关键字的比较?
相同点:它们修饰的符号都是仅当前文件可见的。
不同点:static修饰的函数在符号表中产生符号,但是符号都是local的,在链接时不受链接器的处理。inline修饰的函数最终是不在符号表中产生符号的。
inline函数和普通函数的区别?
在调用内联函数的调用点,直接将函数的代码展开,也就是说,在调用内联函数的时候,没有栈桢的开辟和回退过程。
而当调用一个普通函数时,会为函数开辟栈桢,压参入栈,生成汇编语言的调用,执行return的过程,相比之下就增加了函数的开销。
用内联取代宏
在c语言中,我们常使用宏来提高代码的执行效率,而我们都知道,对宏的处理是在预编译的阶段,预处理器用复制宏代码的方式代替函数调用,从而省去了开辟栈桢、汇编等过程,从而提高速度。而宏最大的问题就是太容易出错了,在预编译时只进行替换不进行类型检查,函数容易产生意想不到的隐患。
而对于任何内联函数,编译器在符号表中放入函数的声明,如果编译器没有发现内联函数存在错误,那么该函数的代码也就被放到符号表中。在调用一个内联函数时,编译器首先检查调用是否正确(进行类型安全检查)。如果调用正确,内联函数的代码就会直接替换函数的调用,省去了函数的开销。
相比于宏,内联函数会进行类型检查,或者自动类型转换,假如内联函数时成员函数,对象的地址会被放在合适的地方,这也是宏办不到的。
内联函数既具备宏代码的效率,又增加了安全性,并且可以自由操作类的数据成员,所以相比之下,inline的使用更加好一点。
**************************************************************
虽然说在C++程序中,最好用inline替换所有的宏,但断言"assert"是例外,assert是仅在debug版本下检查“不应该”发生的情况。为了不让程序在debug版本和Release版本引起差别,assert不应该产生任何作用。如果assert是一个函数,那么会引起代码、内存的变动,从而会导致debug版本和Release版本引起差别。所以assert不是函数,而是宏。
谨慎使用内联函数:
内联是以代码的膨胀为代价,省去函数调用的开销,从而提高函数的执行效率。所以如果1)函数体内代码较长,使用内联函数将导致内存消耗代价较高 2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
所以在使用内联函数的时候,需要谨慎使用,以使得函数的效率更高。