C++ 内联函数
为学者日益,为道者日损,损之又损,以至于无为,无为而无不为。 -- 老子
c++从C中继承的一个重要特性是效率! 如果c++的效率显著地低于c的效率,那么,就会有很大一批程序员不去使用c++。
在c中提高效率的一个方式是使用宏(macro)。 使用宏 可以不需要普通的函数调用代价即可使之看起来像函数调用。宏的实现是用预处理器而不是编译器。预处理器直接使用宏代码代替宏调用,所以就没有了参数压栈、生成汇编语言CALL、执行汇编语言return的开销。所有的工作由预处理器来完成, 从而 不用花费额外时间就有了程序调用的便利和可读性。
但是在c++中使用预处理器宏存在两个问题。 第一个在c中也存在: 宏看起来像一个函数调用,但不总是如此,容易隐藏难以发现的错误。 第二个问题是c++特有的:预处理器不允许访问类的成员数据, 这意味着宏不能用作类的成员函数。
为了既保持预处理器宏的效率又增加安全性,而且还能像一般成员函数一样可以在类里访问自如,c++引入了内联函数(inline function)。
预处理器的缺陷
eg. #define F (x) (x+1)
现在假如有一个F的调用: F(1), 由于在定义时F与(x)之间存在空格, 预处理器展开后的样子是:
(x) (x+1)(1)
去掉F与(x)之间空格后,在调用时写成F (1),能被正确地展开称(1+1).
-----------------需要继续理解这个截图。 意思是在类的定义中使用#define没有意义吧。
内联函数:
在C++中宏的概念是使用内联函数来实现的,而无论从哪一方面来说,内联函数都是真正的函数。唯一不同之处是内联函数在适当的地方像宏一样展开,所以不需要函数调用的开销。
任何在类中定义的(在花括号内)函数会自动地成为内联函数;
也可以在非类的函数前面加上inline关键字使之成为内联函数:必须使函数体和声明结合在一起,否则,编译器将它作为普通函数对待,例如,inline int plusOne(int x); 没有任何效果,有效的方式是:
inline int plusOne(int x){return ++x;}
类内部的内联函数:
任何在类中定义的(在花括号内)函数会自动地成为内联函数;
在类中,访问函数(read, set)经常被设置为内联函数。
编译器决定是否执行内联:
常用的宏定义: