C/C++ 之内联函数

  在C中可以使用#define提高执行效率,但是容易出错,而在C++ 支持函数内联,其目的亦是如此。

(1)inline的工作原理:

  对于任何内联函数,编译器在符号表里放入函数声明(包括名字,参数类型,返回值类型)。如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表中。在调用一个内联函数时,编译器首先检查调用是否正确,比如进行类型安全检查,进行类型转换等。如果正确,内涵函数的代码将会直接替换函数调用,于是省去了函数调用的开销。

  这个与#define是不同的,因为#define不能进行类型安全检查,或者自动类型转换。如果内联函数时成员函数,对象的地址this会被放在合适的地方,这个也是预处理不能办到的。

(2)inline的编程风格:

  关键字inline必须与函数定义提放在一起才能使函数成为内联,仅将inline放在函数声明中是无效的,比如:

  inline void foo(void);    // 仅与声明放在一起无效    

  void foo(void)

  {...}

  与定义体放在一起是有效的,比如:

  void foo(void);     

  inline void foo()

  {....}

  这样可以看出,inline是一种用于“实现”的关键字,但是个人感觉,在声明中也写上inline,虽然这样可能导致声明与定义混为一谈,但是这样很容易让你的小伙伴们一目了然。

(3) inline的使用:

  在一定程度上,使用inline的确可以提高函数的执行效率,但是依然建议慎用内联。原因在于内联是以代码复制为代价的,仅仅省去了函数的调用开销,但是执行函数体内代码的时间变长。所以建议:inline函数体内的代码不宜过长。

  当然,一些编译器会根据函数的定义体,自动取消不值得的内联,不过目前我还没注意到。等发现了再做补充^_^

时间: 2024-07-29 19:48:23

C/C++ 之内联函数的相关文章

代码重构之内联函数

意图 - 内部代码和函数名称同样清晰易读,去除无用的间接层 示例 /** * 内联函数之前 * Created by luo on 2017/4/18. */ public class InlineMethodBefore { private Integer _numberOfLateDeliveries ; int getRating(){ return (moreThanFiveLateDliveries()) ? 2 : 1; } private boolean moreThanFiveL

Java之内联函数

以前用过C++,知道它里面有一个内联函数这个概念,一般情况用inline关键字修饰,在C++定义类时,那种写中Class定义里面的函数,也被编译器当做内联函数处理. 说了这么多,还没说什么是内联函数.所谓内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度. 现在该说Java了,对应Java语言中也有一个关键字final来指明那个函数是内联的,例: Java代码   public final void doSo

C++学习之内联函数

内联函数与宏区别 需要在函数前加上关键字inline,但inline是建议性关键字,当请求将函数作为内联函数时,编译器并不一定会满足这种要求.内联函数尽量避免函数体过长.含有循环.递归. 内联函数的优势在于做参数类型检查,而宏定义不会,宏只是简单的文本替换. 1.宏不能访问对象的私有成员.2.宏的定义很容易产生二意性. 内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的.而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参

C++之内联函数与constexpr

inline 函数 规模小,流程直接且频繁调用 cout<<shortString(s1,s2)<<endl; = cout<<(s1.size()<s2.size()?s1:s2)<<endl; constexpr函数是指能用于常量表达式的函数.函数的返类型及所有形参的类型都得是字面值类型,而且函数体中必须有一条return语句:

关于C++内联函数

关于C++内联函数有以下实验: 有三段测试代码 1.手动展开内联函数. 2.非内联函数. 3.inline标记的内联函数.(函数只有一行代码,以确保函数被内联) 测试三种情况: VS工程在Release版下的有关内联的三个设置选项 1./Ob0 禁用内联展开(默认情况下是打开的). 2./Ob1 只展开标记为 inline 或 __inline 的函数,或在类声明内定义的 C++ 成员函数中的函数. 3./Ob2 展开标记为 inline 或 __inline 的函数和编译器选择的任何其他函数(

java内联函数

在说内联函数之前,先说说函数的调用过程. 调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到  转去执行该函数前的地方.这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保  存地址继续执行.也就是通常说的压栈和出栈.因此,函数调用要有一定的时间和空间方面的开销.那么对于那些函数体  代码不是很大,又频繁调用的函数来说,这个时间和空间的消耗会很大. 那怎么解决这个性能消耗问题呢,这个时候需要引入内联函数了.内联函数

内联函数详解

什么是内联性和外联函数 类的成员函数可以分为内联函数和外联函数.内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内.而说明在类体内,定义在类体外的成员函数叫外联函数.外联函数的函数体在类的实现部分. 内联函数在调用时不是像一般的函数那样要转去执行被调用函数的函数体,执行完成后再转回调用函数中,执行其后语句,而是在调用函数处用内联函数体的代码来替换,这样将会节省调用开销,提高运行速度. 内联函数与前面讲过的带参数的宏定义进行一下比较,它们的代码效率是一样的,但是内联函数要优于宏定义

内联函数的定义及说明

一.什么叫inline函数? inline(小心,不是online),翻译成"内联"或"内嵌".意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置.这样做的好处是省去了调用的过程,加快程序运行速度.(函数的调用过程,由于有前面所说的参数入栈等操作,所以总要多占用一些时间).这样做的不好处:由于每当代码调用到内联函数,就需要在调用处直接插入一段该函数的代码,所以程序的体积将增大.拿生活现象比喻,就像电视坏了,通过

宏定义与内联函数

1.宏定义的规则和使用解析(1)宏定义的解析规则就是:在预处理阶段由预处理器进行替换,这个替换是原封不动的替换.(2)宏定义替换会递归进行,直到替换出来的值本身不再是一个宏为止.(3)一个正确的宏定义式子本身分为3部分:第一部分是#dedine ,第二部分是宏名 ,剩下的所有为第三部分.(4)宏可以带参数,称为带参宏.带参宏的使用和带参函数非常像,但是使用上有一些差异.在定义带参宏时,每一个参数在宏体中引用时都必须加括号,最后整体再加括号,括号缺一不可. 宏定义示例1:MAX宏,求2个数中较大的