赞
踩
Hello everybody!今天咱们来讲一下内联函数,它在某些方面还是很有用的!
以inline修饰的函数叫做内联函数,编译时c++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
如果有一个小函数需要频繁调用,频繁建立栈帧会降低程序运行的效率。c语言中解决这个问题的方法是用宏来解决。比如实现两个数相加的宏:
虽然c语言中的宏虽然能够很好的解决这个问题,但是缺点也有不少:
1.语法复杂(需要很多括号,不能写分号等等)
2.没有类型检查
3.不能调试
特别是语法复杂这个点,相比学过c语言的小伙伴都深有体会。
正因如此,c++提出了更好的解决方式:内联函数。
1.inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大。优势:少了调用开销,提高程序运行效率。
2.内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求。
一般来说,内联机制用于优化规模较小,流程直接,频繁调用的函数,很多编译器都不支持内联递归函数,而且一个75行的函数也不大可能在调用点内联地展开。
如果一个频繁调用的比较大的函数内联展开会导致代码量过大。
内联函数不支持声明与定义分离。因为它在调用处展开,不会进入符号表,在链接过程中找不到内联函数的定义而报错。
因此,内联函数直接在头文件中给出定义即可,不用声明与定义分离。
但是如果不用内联函数,就不可以在头文件中给出定义,只能给声明。因为另外两个文件会包含头文件,在编译的过程中,头文件会展开,导致另外两个文件都有该函数的定义,链接时会出现重定义的情况!
因此在头文件中写函数时,要么在写小的内联函数并直接给出定义,要么写大函数声明与定义分离。如果一定要在头文件中定义的话也可以用static修饰该函数,这样大函数也可以直接在头文件中定义。它的原理其实与内联函数类似:
static会改变函数的链接属性,只在当前文件可见。所以就算另外两个文件中的头文件中有该函数的定义,也不会出现重定义的问题!
总结一下声明与定义分离:
大函数选择声明与定义分离或是用static修饰。
小函数用内联。
OK!今天的话题就先到这里,欢迎在评论区提出自己的疑问!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。