iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++11中内联函数(inline)用法实例
  • 461
分享到

C++11中内联函数(inline)用法实例

c++内联函数定义c++11内联函数inline怎么用 2022-11-13 19:11:40 461人浏览 泡泡鱼
摘要

目录inline 是什么?引入inline的目的是什么?内联函数的特点内联函数的写法隐式内联和显式内联inline 函数的编译器处理内联函数优缺点虚函数可以是内联函数吗?虚函数内联条

inline 是什么?

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

引入inline的目的是什么?

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

内联函数的特点

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

内联函数的写法

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

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

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

//方式1 加 inline(建议使用)
inline int TestFunc(int a, int b);

//方式2 原始常见声明方式
int TestFunc(int a, int b);

//在源文件中定义
//正确
inline int TestFunc(int a, int b){
    //do something
    return 0;
}
//错误
int TestFunc(int a, int b){
    //do something
    return 0;
}

隐式内联和显式内联

隐式内联的写法

class CppObj {
    int TestFuncA() { return 0; }       //隐式内联
    vitrual int TestFuncB() { return 0; }    //虚函数不会进行隐式内联   
}

显式内联的写法

class CppObj {
    int TestFuncA();
    inline int TestFuncB();
    vitrual int TestFuncC();
}
inline int CppObj::TestFuncA() {   //显式内联
    return 0; 
} 

inline int CppObj::TestFuncB() {   //显式内联
    return 0; 
} 

inline 函数的编译器处理

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

内联函数优缺点

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

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

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

虚函数内联条件?

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

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

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

代码释义

#include <iOStream>
using namespace std;
class Base {
public:
	virtual ~Base() {}
	inline virtual void FuncName() { cout << "this is Base " << endl; }
};

class Derived : public Base {
public:
	inline virtual void FuncName() { cout << "this is Derived" << endl; }
};

int main()
{
	// 编译器具有实际对象,所以它可以是内联的.
	Base b;
	b.FuncName();

	// 编译器具有对象的指针,呈现多态性,运行时期才能确定,所以不能内联。
	Base* p = new Derived();
	p->FuncName();

	delete p;
	p = nullptr;

	system("pause");
	return 0;
}

参考连接:

Are “inline virtual” member functions ever actually “inlined”?

总结 

到此这篇关于C++11中内联函数(inline)用法的文章就介绍到这了,更多相关C++11内联函数inline内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++11中内联函数(inline)用法实例

本文链接: https://www.lsjlt.com/news/170492.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++11中内联函数(inline)用法实例
    目录inline 是什么?引入inline的目的是什么?内联函数的特点内联函数的写法隐式内联和显式内联inline 函数的编译器处理内联函数优缺点虚函数可以是内联函数吗?虚函数内联条...
    99+
    2022-11-13
    c++内联函数定义 c++11内联函数 inline怎么用
  • C++ 内联函数inline案例详解
    使用函数能够避免将相同代码重写多次的麻烦,还能减少可执行程序的体积,但也会带来程序运行时间上的开销。 函数调用在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还要将实参的值复...
    99+
    2022-11-12
  • inline内联函数怎么在C++项目中使用
    本篇文章为大家展示了 inline内联函数怎么在C++项目中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。指定内联函数的方法很简单,只需要在函数定义处增加 inline 关键字。请看下面的例子:...
    99+
    2023-06-06
  • C++内联函数inline与auto关键字怎么使用
    这篇文章主要介绍“C++内联函数inline与auto关键字怎么使用”,在日常操作中,相信很多人在C++内联函数inline与auto关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++内联函数...
    99+
    2023-06-30
  • C++ 引用与内联函数实例分析
    这篇文章主要介绍“C++ 引用与内联函数实例分析”,在日常操作中,相信很多人在C++ 引用与内联函数实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++ 引用与内联函数实...
    99+
    2023-06-30
  • C++深入探索内联函数inline与auto关键字的使用
    目录1.内敛函数1.1问题引入1.2内联函数的概念1.3内敛函数的特性2.auto关键字2.1 auto简介2.2 auto的使用细则2.3 auto不能推导的场景2.4 auto与...
    99+
    2022-11-13
  • C语言中的内联函数(inline)与宏定义(#define)详细解析
    先简明扼要,说下关键:1、内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样在运行时速度更快。2、内联函数可以调试,而宏定义是不...
    99+
    2022-11-15
    内联函数 宏定义
  • C#中内联函数的用法介绍
    C++ 中有个内联函数,使用 inline 来修饰函数,编译器就会对其进行优化,将此函数作为代码判断插入到调用处。 函数调用在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还...
    99+
    2022-11-13
  • C#中内联函数怎么用
    这篇文章将为大家详细讲解有关C#中内联函数怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C++ 中有个内联函数,使用 inline 来修饰函数,编译器就会对其进行优化,将此函数作为代码判断插入到调用...
    99+
    2023-06-29
  • C#中条件编译、内联函数、CLS的示例分析
    这篇文章主要为大家展示了“C#中条件编译、内联函数、CLS的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中条件编译、内联函数、CLS的示例分析”这篇文章吧。1、条件编译#if&nb...
    99+
    2023-06-29
  • C++内联函数不宜使用情况的示例分析
    这篇文章将为大家详细讲解有关C++内联函数不宜使用情况的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C++语言中的各种应用是一个非常高深的内容,其中的语法、特性、标准类库都是我们值...
    99+
    2023-06-17
  • C++11中std::function与std::bind的用法实例
    目录关于std::function 的用法:关于std::bind 的用法:附:std::function与std::bind双剑合璧总结关于std::function 的用法: 其...
    99+
    2022-11-13
  • C++11中bind绑定器和function函数对象实例分析
    这篇文章主要介绍了C++11中bind绑定器和function函数对象实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++11中bind绑定器和function函数对象实例分析文章都会有所收获,下面我们...
    99+
    2023-07-02
  • c语言abort函数实例用法
    1、abort函数的作用是异常终止一个进程,意味着abort后面的代码将不再执行。 2、当调用abort函数时,会导致程序异常终止,而不会进行一些常规的清除工作。 实例 #inc...
    99+
    2022-11-12
  • python高级内置函数用法实例
    1、enumerate返回针对序列类型的可迭代对象的枚举对象。 2、eval取出字符串中的内容。 将str中有效的表达式返回计算结果。 3、exec运行编译后的字符串。 4、filt...
    99+
    2022-11-12
  • C++11中explicit类型转换运算符的实例用法
    这篇文章主要介绍“C++11中explicit类型转换运算符的实例用法”,在日常操作中,相信很多人在C++11中explicit类型转换运算符的实例用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11...
    99+
    2023-06-19
  • C语言中qsort函数的介绍与用法实例
    目录一.qsort函数是什么 二.使用qsort排序-以升序为例1.整形数组排序2.字符数组排序3.字符指针数组排序4.结构体数组排序5.浮点型数组排序三.使用冒泡排序思想...
    99+
    2022-11-12
  • python中similarity函数实例用法
    1、similarity函数接收两个列表,并返回由两个列表中相同元素组成的列表。 2、函数使用列表推导,遍历所有a列表中的元素,并使用in关键词来判断这些元素是否存在于b列表中。 实...
    99+
    2022-11-12
  • php中trim函数实例用法
    trim函数用于去除字符串两端的空白字符或其他指定字符,并返回处理后的字符串。trim函数的语法如下:```phptrim...
    99+
    2023-08-15
    PHP
  • python中os.path.join()函数实例用法
    1、说明 拼接文件路径,可以有多个参数。 2、语法 os.path.join(path1,path2,*) path1 初始路径。 path2 需要拼接在其后的路径。初始路径文件夹下的文件或文件夹。可以有多个需...
    99+
    2022-06-02
    python os.path.join()
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作