博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
inline函数的总结
阅读量:5144 次
发布时间:2019-06-13

本文共 1525 字,大约阅读时间需要 5 分钟。

在函数返回类型前加上关键字inline就可以将函数指定为内联函数:

1 inline const string& shortString(const string &s1, const string &s2) {2     return s1.size() < s2.size() ? s1 : s2;3 }

函数指定为内联函数,(通常)就是将它在程序调用点上”内联地“展开。假设我们将shortString定义为内联函数,则调用:

1 cout<
<

在编译时展开为:

1 cout<<(s1.size() < s2.sizre()  ? s1 : s2)<

   

将函数声明为内联的方法:

  1. 在函数返回类型前加inline(inline return_type function(parameters))。成员函数可以在声明时候添加inline也可以在定义时候添加inline。

  2. 将成员函数定义在类定义式内,这个成员函数就被隐喻声明为inline.

 

内联说明(inline specification)对于编译器来说只是一个建议,编译器可以忽略这个建议。

 

将内联函数放入头文件内:  

  内联函数的定义应该在头文件中定义。因为大多数建置环境(build environments)在编译过程中进行inlining.而为了将一个“函数调用”替换为“被调用函数的本体”,编译器必须知道那个函数长什么样子。仅有函数声明是不够的;而且内联函数有可能在程序中定义不止一次,这时必须保证在所有源文件中,其定义是完全相同的。把内联函数的定义放在头文件中,可以确保在调用函数的时候所使用的定义是相同的。

 

 

内联函数的优点: 

  可以避免调用函数的开销。当函数体比较小的时候,内联函数可以令目标代码更加高效。对于存取函数以及其他一些比较短的关键执行函数。

 

内联函数的缺点:

  1. 由于将对函数的每一个调用都以函数本体替换之。所以会增加目标代码的大小。造成代码膨胀。这将导致程序体积太大,不利于在内存不大的机器上运行。

  2. inline函数无法随着程序库的升级而升级。如果程序库中包含内联函数,一旦内联函数被改变,那么所有用到程序库的客户端程序都要重新编译。如果函数不           是内联函数,一旦它有任何修改,客户端只需要重新连接就好,远比诚信编译的负担少的多。在头文件加入或修改内联函数时,使用该头文件的所有源文件都必          须重新编译。

  3. 很多调试器无法调试内联函数。很多建置环境仅仅只能”在调试板程序中禁止发生inlining“

 

  一般来说,内联机制适用于优化小的、只有几行的而且经常被调用的函数。一个比较得当的处理规则是,不要内联超过10行的函数。只有当函数10行甚至更少时才会将其定义为内联函数。

 

不适用的情况:

1. 大多数编译器不支持递归函数的内联

2. 包含循环或switch语句的函数是得不偿失的,除非在大多数情况下,这些循环或switch语句从不执行。

3. 虚函数

  大部分编译器将太过复杂的函数inling,而所有堆virtual函数的调用(除非是最平淡无奇的)也都会使inling落空。因为virtual意味“等待,知道运行期才确定调用哪个函数”而inline意味着“执行前,先将调用动作替换为被执行函数的本体”。如果编译器不知道该调用哪个函数,你就很难责备它们拒绝将函数本体inlining。

4. 构造函数和析构函数

  编译器会为构造函数和析构函数插入许多代码。

  

转载于:https://www.cnblogs.com/vincently/p/4213888.html

你可能感兴趣的文章
【笔记】Cocos2dx学习笔记
查看>>
PHP设计模式之:单例模式
查看>>
c++输出缓冲区刷新
查看>>
Linux查看CPU和内存使用情况总结
查看>>
session丢失问题
查看>>
Python 批量修改root密码
查看>>
ThinkSNS+ 基于 Laravel master 分支,从 1 到 0,再到 0.1
查看>>
WEB服务器:Apache、Tomcat、JBoss、WebLogic、Websphere、IIS的区别与关系
查看>>
软件工程 speedsnail 冲刺7
查看>>
虚拟机CentOS设置IP
查看>>
Django之ORM多对多表创建方式,AJAX异步提交,分页器组件等
查看>>
SqlServer查询表名的备注(查询表名描述 MS_Description)
查看>>
Set集合HashSet,TreeSet
查看>>
Visual Studio 2015 终于还是装上了
查看>>
libusb(.NET)开源项目使用小结
查看>>
windows下 gvim 配置
查看>>
no route to host解决方案、Failed to start LSB: Bring up/down networking的问题解决方案
查看>>
去哪网实习总结:递归构建“流程运行顺序”的XML文件(JavaWeb)
查看>>
机器学习笔记十三:Ensemble思想(上)
查看>>
Unity3D中组件事件函数的运行顺序
查看>>