| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> inline函数 -> 正文阅读 |
|
[C++知识库]inline函数 |
在C/C++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。 栈空间就是指放置程序的局部数据(也就是函数内部数据)的空间。 在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如函数的死循环滴贵调用的最终结果就是导致栈内存空间枯竭。
上面的例子就是标准的内联函数的用法,使用inline修饰带来的好处我们表面看不出来,其实,在内部的工作就是在每个for循环的内部调用dbtest(i)的地方都换成了(v % 2 > 0) ? “ji” : “ou”,这样就避免了频繁调用函数对内存重复开辟所带来的消耗。 inline使用限制 inline的使用是有所限制的,inline只适合函数体内代码简单的函数使用,不能包含复杂的结构控制语句例如while、switch,并且内联函数本身不能是直接递归函数。 inline函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。 建议inline函数的定义放在头文件中,因为内联函数要在调用点展开,所以编译器必须随处可见内联函数的定义,要不然就成了非内联函数的调用,所以这要求每个调用了内联函数的文件都出现了该内联函数的定义。 因此,将内联函数的定义房子头文件里实现是合适的,省却你为每个文件实现一次的麻烦。 声明跟定义要一致:如果在每个文件里都实现一次该内联函数的话,那么最好保证每个定义都是一样的,否则,将会引起问题。 类中的成员函数与inline 定义在类中的成员函数默认都是内联的,如果在类定义时就在类内给出函数定义,那是最好的。如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上inline,否则就认为不是内联的。
将成员函数的定义体放在类声明之中虽然能带来书写上的方便,但不是一种良好的编程风格,上例应该改成:
inline是一种“用于实现的关键字” 关键字inline必须与函数定义体放在一起才能使函数称为内联,仅将inline放在函数声明前面不起任何作用。 如下风格的函数不能成为内联函数:
如下风格的函数则成为内联函数:
所以说,inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。 慎用inline 内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数? 内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。 如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,小号更多的内存空间。 以下情况不宜使用内联: 如果函数题内的代码比较长,使用内联将导致内存消耗代价较高。 如果函数题内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如"偷偷地"执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。一个好的编译器将会根据函数的定义体,自动地取消不值得的内联(这进一步说明了 inline 不应该出现在函数的声明中)。 总结 内联函数并不是一个增强性能的灵丹妙要。当只有函数非常短小的时候它才能得到我们想要效果,但是如果函数并不是很短而且在很多地方都被调用的话,将会使得执行体的体积增大。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:44:55- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |