1、为什么引入内联函数
引入内联函数的目的是替代C语言中宏定义的表达式,从而用来解决程序中函数调用的效率问题,例如以下代码在C中定义了一个函数表达式宏:
#define Function(x, y) (x)*(y)
这样做的好处是:它使用预处理实现,没有了参数压栈、代码生成等一系列的操作,,解决了频繁调用而小号大量栈空间的问题。但是它也有一些缺点:
1、就像上面这个函数定义时参数都加了括号,是因为程序在使用这个函数的时候,只是一个简单的文本替换,不能对参数进行有效的检查,同时可能会存在二义性,关于这里可以参考你想了解的那些宏定义#define的用法;
2、宏定义函数的返回值不能被强制转换为可转换的合适类型。所以在·C++中推出了inline函数。继承了宏定义的优点,又克服了它的缺点,一举两得。
2、为什么inline函数较好取代了表达式函数的预定义
打开小本本记下来:
1、inline定义的内联函数,函数的代码被放进符号表中,在使用的时候直接展开(和宏定义一样),省去了调用的开销,所以效率更高;
2、类的内联函数是一个真正的函数,编译器在调用一个内联函数时,首先会检查它的参数类型,保证调用正确,任何进行一系列的相关检查,和对待其他任何真正的函数一样,这样就消除了它的局限性;
2、inline可以作为某个类的成员函数,这样就可以使用该类的保护成员以及私有成员。
3、内联函数使用场合
定义存取函数:我们在定义一个类时,一般会把数据成员定义为私有的或者是保护的,这样的外界就不能直接访问类内部的这些成员,这个时候我们就可以用inline函数定义一个成员接口函数:
class Example
{
private:
int t1;
public:
int read()
{
return t1;
}
void set(int i);
};
inline void Example::set(int i)
{
t1 = i;
}
4、内联函数使用注意问题
我们要注意的是内联函数事宜代码膨胀(赋值)为代价的,是省去了函数调用的开销,如果执行函数体的开销比调用开销大,那么这个时候是不划算的,inline函数的使用应该注意以下这些问题:
1、函数体代码较长会使得内存消耗代价较高;
2、函数体内出现循环、递归时,此时执行函数体比调用函数体开销更大;
3、另外,类的构造函数、析构函数会让人误以为使用内联会更有效,但是需要注意的是类的构造函数和析构函数可能会执行基类的构造或者析构函数。
5、内联函数和宏定区别
讲了这么多,相信你对于内联函数已经有了一个认识,最后我们一起了解以下内联函数和宏的区别:
1、内联函数在编译时展开,宏在预编译时展开;
2、在编译的时候,内联函数时直接被镶嵌到目标代码中,而宏仅仅是一个简单的文本替换;
3、内联函数可以完成类型检查、语句准确性检查,而宏定义不能完成这些操作;
4、宏不是函数,内联函数是函数;
5、宏定义是一定要小心处理宏参数,一不小心就会引起歧义性,具体可见你想了解的那些宏定义#define的用法。