inline(内联函数)是C++中引入的机制,其目的是解决使用宏定义的一些缺点。
1、为什么要引入内联函数
引入内联函数的主要目的是用来替代C中表达式形式的宏定义,解决程序中函数调用的效率问题。
由于宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,
代码生成等一系列的操作,因此效率很高。由于宏定义在使用时只是做预处理器符号表中的简单替换,
因此不能进行参数有效性的检查,也就不能享受C++编译器严格类型检查的好处,
另外它的返回值也不能被强制转换成合适的类型,这样,它的使用存在着一系列的隐患和局限性。
另外,在C++中引入了类及类的访问控制,如果一个操作数或者一
个表达式涉及到累的保护成员或私有成员,就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。
2、为什么inline能很好的取代表达式形式的宏定义呢?
(1)inline定义类的内联函数,函数代码被放入符号表中,在使用时直接进行替换
(像宏一样展开),没有了调用的开销,效率很高。
(2)类的内联函数也是一个真正的函数。编译器调用内联函数时,首先
会检查它的参数类型,保证调用正确,然后进行一系列的相关检查,就像对待
任何一个真正的函数一样。这样就消除了它的隐患和局限性。
(3)inline可以作为某个类的成员函数,当然可以使用所在类的保护成员和私有成员。
3、为什么不把所有的函数都定义成内联函数?
内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。
每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。
以下情况不宜使用内联:
(1)如果函数体的代码比较长,使用内联将导致内存消耗代价较高;
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大;
4、内联函数与宏的区别
(1)内联函数在编译时展开,宏在预编译时展开。
(2)在编译的时候内联函数开一直接被嵌入到目标代码中,而宏只是一个简单的文本替换。
(3)内联函数可以完成诸如类型检测语句是否正确等编译功能,宏就不具有这样的功能。
(4)宏不是函数,inline函数是函数。
(5)宏在定义时要小心处理宏参数(一般情况下把参数用括号括起来),否则容易出现
二义性。而内联函数定义时不会出现二义性。
1、为什么要引入内联函数
引入内联函数的主要目的是用来替代C中表达式形式的宏定义,解决程序中函数调用的效率问题。
由于宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,
代码生成等一系列的操作,因此效率很高。由于宏定义在使用时只是做预处理器符号表中的简单替换,
因此不能进行参数有效性的检查,也就不能享受C++编译器严格类型检查的好处,
另外它的返回值也不能被强制转换成合适的类型,这样,它的使用存在着一系列的隐患和局限性。
另外,在C++中引入了类及类的访问控制,如果一个操作数或者一
个表达式涉及到累的保护成员或私有成员,就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。
2、为什么inline能很好的取代表达式形式的宏定义呢?
(1)inline定义类的内联函数,函数代码被放入符号表中,在使用时直接进行替换
(像宏一样展开),没有了调用的开销,效率很高。
(2)类的内联函数也是一个真正的函数。编译器调用内联函数时,首先
会检查它的参数类型,保证调用正确,然后进行一系列的相关检查,就像对待
任何一个真正的函数一样。这样就消除了它的隐患和局限性。
(3)inline可以作为某个类的成员函数,当然可以使用所在类的保护成员和私有成员。
3、为什么不把所有的函数都定义成内联函数?
内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。
每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。
以下情况不宜使用内联:
(1)如果函数体的代码比较长,使用内联将导致内存消耗代价较高;
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大;
4、内联函数与宏的区别
(1)内联函数在编译时展开,宏在预编译时展开。
(2)在编译的时候内联函数开一直接被嵌入到目标代码中,而宏只是一个简单的文本替换。
(3)内联函数可以完成诸如类型检测语句是否正确等编译功能,宏就不具有这样的功能。
(4)宏不是函数,inline函数是函数。
(5)宏在定义时要小心处理宏参数(一般情况下把参数用括号括起来),否则容易出现
二义性。而内联函数定义时不会出现二义性。