【c++】内联函数

Hello everybody!今天咱们来讲一下内联函数,它在某些方面还是很有用的!

【c++】内联函数_第1张图片

1.定义

以inline修饰的函数叫做内联函数,编译时c++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

如果有一个小函数需要频繁调用,频繁建立栈帧会降低程序运行的效率。c语言中解决这个问题的方法是用宏来解决。比如实现两个数相加的宏:

【c++】内联函数_第2张图片

【c++】内联函数_第3张图片

虽然c语言中的宏虽然能够很好的解决这个问题,但是缺点也有不少:

1.语法复杂(需要很多括号,不能写分号等等)

2.没有类型检查

3.不能调试

特别是语法复杂这个点,相比学过c语言的小伙伴都深有体会。

正因如此,c++提出了更好的解决方式:内联函数。

2.特性

1.inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大。优势:少了调用开销,提高程序运行效率。

2.内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求。

一般来说,内联机制用于优化规模较小,流程直接,频繁调用的函数,很多编译器都不支持内联递归函数,而且一个75行的函数也不大可能在调用点内联地展开。

如果一个频繁调用的比较大的函数内联展开会导致代码量过大。

3.声明与定义分离

内联函数不支持声明与定义分离。因为它在调用处展开,不会进入符号表,在链接过程中找不到内联函数的定义而报错。

【c++】内联函数_第4张图片

【c++】内联函数_第5张图片

【c++】内联函数_第6张图片

因此,内联函数直接在头文件中给出定义即可,不用声明与定义分离。

【c++】内联函数_第7张图片

【c++】内联函数_第8张图片

但是如果不用内联函数,就不可以在头文件中给出定义,只能给声明。因为另外两个文件会包含头文件,在编译的过程中,头文件会展开,导致另外两个文件都有该函数的定义,链接时会出现重定义的情况!

【c++】内联函数_第9张图片

【c++】内联函数_第10张图片

因此在头文件中写函数时,要么在写小的内联函数并直接给出定义,要么写大函数声明与定义分离。如果一定要在头文件中定义的话也可以用static修饰该函数,这样大函数也可以直接在头文件中定义。它的原理其实与内联函数类似:

static会改变函数的链接属性,只在当前文件可见。所以就算另外两个文件中的头文件中有该函数的定义,也不会出现重定义的问题!

【c++】内联函数_第11张图片

【c++】内联函数_第12张图片

3.1总结

总结一下声明与定义分离:

大函数选择声明与定义分离或是用static修饰。

小函数用内联。

4.结语

OK!今天的话题就先到这里,欢迎在评论区提出自己的疑问!

你可能感兴趣的:(开发语言,c++)