让编译器直接将完整的函数体插入到每一个调用该函数的地方,从而提高函数调用的运行速度。

优秀的JIT编译器会通过侦测运行信息,仅将需要频繁运行的瓶颈部分进行编译,从而大大削减编译所需的时间。

而且,利用运行时编译,可以不用考虑连接的问题而积极运用内联扩展,因此在某些情况下,运行速度甚至可以超过C++。

https://gcc.gnu.org/onlinedocs/gcc/Inline.html

https://zh.wikipedia.org/wiki/内联函数

计算机科学中,内联函数(有时称作在线函数编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支。另外还需要特别注意的是对递归函数的内联扩展可能引起部分编译器的无穷编译。

设计内联函数的动机

内联扩展是一种特别的用于消除调用函数时所造成的固有的时间消耗方法。一般用于能够快速执行的函数,因为在这种情况下函数调用的时间消耗显得更为突出。这种方法对于很小的函数也有空间上的益处,并且它也使得一些其他的优化成为可能。

没有了内联函式,程式员难以控制哪些函数内联哪些不内联;由编译器自行决定是否内联。加上这种控制维度准许特定于应用的知识,诸如执行函式的频繁程度,被利用于选择哪些函数要内联。

此外,在一些语言中,内联函数与编译模型联系紧密:如在C++中,有必要在每个使用它的模块中定义一个内联函数;与之相对应的,普通函数必须定义在单个模块中。这使得模块编译独立于其他的模块。

的比较

通常,在C语言中,内联展开的功能由带参宏(Macros)在源码级实现。内联提供了几个更好的方法:

  • 宏调用并不执行类型检查,甚至连正常参数也不检查,但是函数调用却要检查。
  • C语言的宏使用的是文本替换,可能导致无法预料的后果,因为需要重新计算参数和操作顺序
  • 在宏中的编译错误很难发现,因为它们引用的是扩展的代码,而不是程序员键入的。
  • 许多结构体使用宏或者使用不同的语法来表达很难理解。内联函数使用与普通函数相同的语言,可以随意的内联和不内联。
  • 内联代码的调试信息通常比扩展的宏代码更有用。

语言支持

C++C99C11GNU C都支持内联函数,然而1989 ANSI C,这个最被广泛使用的C标准却不支持。在Ada中,关键字“pragma”可以用来声明内联。其他的大部分编程语言,包括Java和函数式语言,不支持内联函数,但他们的编译器常常进行强制性的内联扩展。不同的编译器在内联扩展上有处理不同复杂程度函数的能力。主流的C++编译器如Visual C++GCC提供了一个选项来自动内联任何一个合适的函数,即使它们没有被声明为内联函数。

内联函数在C++中的写法如下:

inline int max (int a, int b)
{
if (a > b)
return a;
else
return b;
}
a = max (x, y); // 等价于 "a = (x > y ? x : y);"

内联函数的不足

除了通常使用内联扩展可能带来的问题,作为一种编程语言特性的内联函数也可能并没有看起来那么有效,原因如下:

  • 通常,编译器比程序设计者更清楚对于一个特定的函数是否合适进行内联扩展;一些情况下,对于程序员指定的某些内联函数,编译器可能更倾向于不使用内联甚至根本无法完成内联。
  • 对于一些开发中的函数,它们可能从原来的不适合内联扩展变得适合或者倒过来。尽管内联函数或者非内联函数的转换易于宏的转换,但增加的维护开支还是使得它的优点显得更不突出了。
  • 对于基于C的编译系统,内联函数的使用可能大大增加编译时间,因为每个调用该函数的地方都需要替换成函数体,代码量的增加也同时带来了潜在的编译时间的增加。

最新文章

  1. Win7重装系统遇到的问题以及MysQL的问题解决
  2. yum提示字符编码错误
  3. 关于Visual Studio 2013 编译 multi-byte character set MFC程序出现 MSB8031 错误的解决办法
  4. Linux服务器
  5. [转]在PHP语言中使用JSON
  6. springmvc学习(四)
  7. jQuery 自学笔记—8 常见操作
  8. IP子网掩码格式转换
  9. Ubutnu16.04安装pytorch
  10. 从锅炉工到AI专家(1)
  11. VS2015 加快编译速度
  12. mysql数据表的基本操作
  13. ASP.NET MVC - XML节点查找
  14. 【mac上安装&配置&使用git】
  15. MySQL学习(十四)
  16. Python基础之逻辑运算
  17. vue 使用v-cloak让在页面加载时不显示{{}}花括号
  18. 一些基本的操作,编译,构建,单元测试,安装,网站生成和基于Maven部署项目。
  19. 数据结构基础(1)--数组C语言实现--动态内存分配
  20. jQuery中turn.js(翻页效果)学习笔记

热门文章

  1. 为什么MySQL不推荐使用uuid作为主键?
  2. eclipse中安装Springboot的插件
  3. springboot项目配置数据库
  4. HashMap的循环姿势你真的掌握了吗?
  5. [leetcode]罗马数字和阿拉伯数字相互转换
  6. Android基本组件TextView和EditView
  7. Linux 下 swap 分区及作用详解
  8. hadoop集群中zkfc的作用和工作过程
  9. WPF学习笔记01_XAML之简介
  10. SpringBoot项目,如何优雅的把接口参数中的空白值替换为null值?