C++中的内联函数inline总结

2024-06-09 17:32
文章标签 c++ 函数 总结 inline 内联

本文主要是介绍C++中的内联函数inline总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文:http://blog.csdn.net/coder_xia/article/details/6723387

突然看到C++Primer中讲到,对于vector的一个循环,调用语句:(示例代码i=v.begin()不是很规范,虽然不会出错,客官请将就着看)

[cpp]  view plain copy
  1. for (int i=v.begin() ; i<v.size() ; i++)  
  2. {  
  3.     ....  
  4. }  
       对于size()的调用,其实是内联。想到以前貌似是看《高质量C/C++编程》时,提过,在循环时,可以采用变量保存v.size()的值,以减少每个循环的调用开支。于是决定一搜,顺便总结之。

1、inline的引出

考虑下列min()函数(例子来自C++Primer第三版303页)

[cpp]  view plain copy
  1. int min( int v1, int v2 )  
  2. {  
  3.     return( v1 < v2 << v1 : v2 );  
  4. }  
      为这样的小操作定义一个函数的好处是:

     a.如果一段代码包含min()的调用,那阅读这样的代码并解释其含义比读一个条件操作符的实例,可读性会强很多。

     b.改变一个局部化的实现比更改一个应用中的300个出现要容易得多

     c.语义是统一的,每个测试都能保证相同的方式实现

     d.函数可以被重用,不必为其他的应用重写代码

     不过,将min()写成函数有一个严重的缺点:调用函数比直接计算条件操作符要慢很多。那怎么能兼顾以上优点和效率呢?C++提供的解决方案为inline(内联)函数

2、inline的原理:代码替代

       在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替代。

       例如,如果一个函数被指定为inline 函数则它将在程序中每个调用点上被内联地展开例如

[cpp]  view plain copy
  1. int minVal2 = min( i, j );  
在编译时被展开为
[cpp]  view plain copy
  1. int minVal2 = i < j << i : j;  
 则把min()写成函数的额外执行开销从而被消除了。

3、inline的使用

       让一个函数成为内联函数,隐式的为在类里定义函数,显式的则是在函数前加上inline关键字说明。

4、使用inline的一些注意事项

      a.从inline的原理,我们可以看出,inline的原理,是用空间换取时间的做法,是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。所以,如果函数体代码过长或者函数体重有循环语句,if语句或switch语句或递归时,不宜用内联

      b.关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。内联函数调用前必须声明。《高质量C/C++编程》里一个例子。

[cpp]  view plain copy
  1. inline void Foo(int x, int y); // inline 仅与函数声明放在一起  
  2. void Foo(int x, int y)  
  3. {  
  4.     ...  
  5. }  
以上代码不能成为内联函数,而以下则可以

[cpp]  view plain copy
  1. void Foo(int x, int y);  
  2. inline void Foo(int x, int y) // inline 与函数定义体放在一起  
  3. {  
  4.     ...  
  5. }  
       所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。对于以上例子,林锐还建议,只在定义前加上inline,而不是在声明和定义前都加,因为这能体现高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈。

       c.inline对于编译器来说只是一个建议,编译器可以选择忽略该建议。换句话说,哪怕真的写成了inline,也没有任何错误的情况下,编译器会自动进行优化。所以当inline中出现了递归,循环,或过多代码时,编译器自动无视inline声明,同样作为普通函数调用。


总结下:

       楼主觉得可以将内联理解为C++中对于函数专有的宏,对于C的函数宏的一种改进。对于常量宏,C++提供const替代;而对于函数宏,C++提供的方案则是inline。在C中,大家都知道宏的优势,编译器通过复制宏代码的方式,省去了参数压栈,生成汇编的call调用,返回参数等操作,虽然存在一些安全隐患,但在效率上,还是很可取的。

       不过函数宏还是有不少缺陷的,主要有以下:

       a.在复制代码时,容易出现一想不到的边际效应,比如经典的

[cpp]  view plain copy
  1. #define MAX(a, b) (a) > (b) ? (a) : (b)  
在执行语句:
[cpp]  view plain copy
  1. result = MAX(i, j) + 2 ;  
时,会被解释为

[cpp]  view plain copy
  1. result = (i) > (j) ? (i) : (j) + 2 ;  
     b.使用宏,无法进行调试,虽然windows提供了ASSERT宏

     c.使用宏,无法访问类的私有成员
      所以,C++ 通过内联机制,既具备宏代码的效率,又增加了安全性,还可以自由操作类的数据成员,算是一个比较完美的解决方案。

      关于宏,大家还可以参考下:http://dev.yesky.com/260/2095260.shtml,更原创,内容丰富,可取,http://wenku.baidu.com/view/1247bc22192e45361066f564.html总结了各家观点,稍微整理了下,不过还是蛮清楚的。


      就这样吧,菜鸟goes on ~~~

这篇关于C++中的内联函数inline总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1045832

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

python中的高阶函数示例详解

《python中的高阶函数示例详解》在Python中,高阶函数是指接受函数作为参数或返回函数作为结果的函数,下面:本文主要介绍python中高阶函数的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录1.定义2.map函数3.filter函数4.reduce函数5.sorted函数6.自定义高阶函数

Python中的sort方法、sorted函数与lambda表达式及用法详解

《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别