C++11中内联函数(inline)用法实例_第1页
C++11中内联函数(inline)用法实例_第2页
C++11中内联函数(inline)用法实例_第3页
C++11中内联函数(inline)用法实例_第4页
C++11中内联函数(inline)用法实例_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C++11中内联函数(inline)用法实例目录inline是什么?引入inline的目的是什么?内联函数的特点内联函数的写法隐式内联和显式内联inline函数的编译器处理内联函数优缺点虚函数可以是内联函数吗?虚函数内联条件?虚函数表现多态性的时候不能内联总结

inline是什么?

inline是C++11引入的关键字,在函数声明or定义时,返回类型前加上关键字inline,即可以把函数指定为内联函数。

引入inline的目的是什么?

目的是解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。另一方面用于替换C语言的宏(相比较宏是无法在进行类型检查)

内联函数的特点

内联函数的函数内容本质上是写在调用内联函数的地方;内联函数本质上没有入栈出栈的开销;和宏定义相比,内联函数更加安全,编译器会根据函数的要求进行严格的类型和作用域检查,保证调用无误;内联函数一般上不包含循环、递归、switch或较长的代码等复杂操作;类声明中定义的函数,除虚函数外的其他函数都会自动隐式地当成内联函数;

内联函数的写法

这里的一个关键点,inline必须与函数定义放在一起才能使函数成为内联函数,仅将inline放在函数声明前面不起任何作用。

inline是一种用于实现的关键字,不是一种用于声明的关键字。

//在头文件中可以进行显示声明

//方式1加inline(建议使用)

inlineintTestFunc(inta,intb);

//方式2原始常见声明方式

intTestFunc(inta,intb);

//在源文件中定义

inlineintTestFunc(inta,intb){

//dosomething

return0;

intTestFunc(inta,intb){

//dosomething

return0;

隐式内联和显式内联

隐式内联的写法

classCppObj{

intTestFuncA(){return0;}//隐式内联

vitrualintTestFuncB(){return0;}//虚函数不会进行隐式内联

显式内联的写法

classCppObj{

intTestFuncA();

inlineintTestFuncB();

vitrualintTestFuncC();

inlineintCppObj::TestFuncA(){//显式内联

return0;

inlineintCppObj::TestFuncB(){//显式内联

return0;

inline函数的编译器处理

inline函数仅仅是一个开发者对编译器的建议,至于最后能否真正内联,需要看编译器的意思。如果编译器判定函数不复杂,能在调用点展开,就会真正内联。

内联函数优缺点

优点内联函数相比宏函数来说,在代码调用时会做安全检查和类型转换(同普通函数),而宏定义则不会;宏定义不可以在运行时可调试,但内联函数可以;内联函数同宏函数一样会在被调用处进行展开,无需参数压栈、栈帧开辟与回收,结果返回等,从而能提高代码的运行速度。缺点代码膨胀。内联是以代码膨胀(复制)为代价,是典型的以空间换时间的做法。内联函数不可控。内联函数只是编码者对编译器的建议,是否对函数内联,最终决定权在于编译器。inline函数无法随着函数库升级而升级。inline函数的改变需要重新编译,不像non-inline可以直接链接。

虚函数可以是内联函数吗?

虚函数可以是内联函数;inline是可以修饰虚函数;

虚函数内联条件?

可以内联的条件,编译器具有实际对象而不是对象的指针或引用时才会,所以当虚函数表现多态性的时候不能内联。

虚函数表现多态性的时候不能内联

内联是在编译期进行的,但虚函数的多态性在运行期,所以编译器无法知晓运行期具体调用哪个代码

代码释义

#includeiostream

usingnamespacestd;

classBase{

public:

virtual~Base(){}

inlinevirtualvoidFuncName(){cout"thisisBase"endl;}

classDerived:publicBase{

public:

inlinevirtualvoidFuncName(){cout"thisisDerived"endl;}

intmain()

//编译器具有实际对象,所以它可以是内联的.

Baseb;

b.FuncName();

//编译器具有对象的指针,呈现多态性,运行时期才能确定,所以不能内联。

Base*p=newDerived();

p-FuncName();

deletep;

p=nullptr;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论