内联函数
参考;
http://www.cnblogs.com/pengyingh/articles/2405718.html
一、由来
二、要点
1.内联函数可减少cpu的系统开销,并且程序的整体速度将加快,但当内联函数很大时,会有相反的作用,因此一般比较小的函数才使用内联函数.
2.有两种内联函数的声明方法,一种是在函数前使用inline关键字,另一种是在类的内部定义函数的代码,这样的函数将自动转换为内联函数,而且没必要将inline放在函数前面.
3.内联是一种对编译器的请求,下面这些情况编译器会拒绝服从这项请求.
- 函数中包含有循环
- switch或goto语句
- 递归函数
- 含有static的函数.
由此可以看出,内联函数和成员函数没什么区别,区别就在于怎样加快函数的执行速度而已。
内联函数是浪费空间来节省时间的设置,因为函数的调用是很浪费时间的,写成内联函数可以在每次调用时用函数体内容代替函数调用,有点类似一个宏定义。当函数体语句较少,且没有复杂的循环语句,且调用次数较多时,就可以用内联函数。
三、总结
1.inline函数仅仅是一个编码者对编译器的建议或请求,编译器不一定答应你
最后能否真正内联,看编译器的意思,它如果认为你的函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,你声明内联只是一个建议而已.
2.其次,因为内联函数要在调用点所在编译单元展开,所以编译器必须在调用点所在编译单元可见内联函数的定义,要不然,就成了非内联函数的调用了.
所以,这要求你的每个调用了内联函数的文件都出现了该内联函数的定义,因此,将内联函数放在头文件里实现是合适的,省却你为每个文件实现一次的麻烦.而你所以声明跟定义要一致,其实是指,如果你在每个文件里都实现一次该内联函数的话,那么,你最好保证每个定义都是一样的,否则,将会引起未定义的行为,即是说,如果不是每个文件里的定义都一样,那么,编译器展开的是哪一个,那要看具体的编译器而定.所以,最好将内联函数定义放在头文件中.
3.类中的成员函数缺省都是内联的
如果你在类定义时就在类内给出函数,那当然最好.如果你在类中未给出成员函数定义,而你又想内联该函数的话,那在类外要加上inline,否则就认为不是内联的.而且刚说了,内联函数最好放在头文件内,所以最好在类定义的头文件里把类的内联函数都实现了.
4.将声明与定义分开的问题
不会编译出错,将声明与定义分开的话,这样的后果会带来编译器并不随处可见该函数定义,所以,只能在你实现定义的那个文件里,将该函数看成内联(如果可以内联的话),在其它文件,仍看成是普通函数.
5.可以有static inline,extern inline
6.inline函数是可以被重复定义的.