很多时候,我们将一个小的表达式写成一个函数。主要是为了:
1;阅读和理解更加容易
2:如果要做修改,修改函数要比修改每一处表达式容易的多
3:函数可以重用。
但是调用函数比求解等价表达式要慢得多。在大多数机器上,调用函数都要做很多工作,调用前要先保存寄存器,并在返回时恢复。复试实参,程序还调转到一个新的位置执行。
则内联函数引入:
内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是否能形成内联函数,需要看编译器对该函数定义的具体处理。
一般情况下,内联函数的内容应该是多次执行,并且是小的,只有几行的。
大多数编译器不支持递归函数的内联,编译器在内联点展开该函数的代码,内联函数可能在程序中定义不止一次,只要在某个源文件中只定义一次,而且在所有源文件中定义必须一致,
因此,一般将内联函数放在头文件中,为了达到一致,在头文件中加入和修改内联函数,包含这个头文件的源文件必须重新编译。
内联函数的特点:
主要是避免函数调用的开销。提高计算速度。不需要而外的空间和时间的开销。
声明:
inline void a();
内联函数和宏的区别:
内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
但是宏也有很多的不尽人意的地方。
1、.宏不能访问对象的私有成员。
2、.宏的定义很容易产生二意性。
eg:
Class TableClass{ Private: Int I,j; Public: Int add() { return I+j;}; Inline int dec() { return I-j;} Int GetNum(); } inline int tableclass::GetNum(){ return I; } |
上面申明的三个函数都是内联函数。在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。