广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++inline函数的特性你了解吗
  • 468
分享到

C++inline函数的特性你了解吗

2024-04-02 19:04:59 468人浏览 八月长安
摘要

目录一.inline的作用(内联函数)二.inline的实现(注意debug模式下内联函数不会展开)三.使用inline的注意事项四.inline和预处理的区别总结一.inline的

一.inline的作用(内联函数)

我们使用关键字inline和函数定义一起就可以创建一个内联函数,它的作用就是减少函数调用的开销,假如我们的程序中有一个函数会频繁的被调用,这样使程序的运行速度十分缓慢,那么我们使用内联函数,就可以解决这种问题,提高程序的运行效率.

内联函数的定义:

inline void add(int a, int b){
    return a+b;
}

上面这个就是一个内联函数,假如我们的程序中频繁使用add操作时,将其声明为内联函数就可以减少调用开销提高效率.

注意: 

1.inline关键字是一种"用于实现的关键字",而不是"用于声明的关键字", 换句话说inline只有放在函数的定义前,才有可能使该函数成为内联函数,放在函数声明前无效.

2.另外一点是:在c++的类中定义的成员函数默认就是内联函数,但前提是在类中定义,因为我们正常的定义类的方式是在头文件中声明类的成员变量和成员函数,在原文件中对类的成员函数进行定义,此时成员函数的定义发生在类外,所以自然就不再是内联函数了,如果还要让其成为内联函数,就需要我们手动添加inline.

3.至于第一点中我为什么要说可能使该函数成为内联函数,是因为inline是一种推荐型关键字,他并不保证该函数一定会成为内联函数,而是编译器在编译的时候获取有inline建议的函数对其规模,内容,方法等要素进行判断,如果满足编译器要求该函数会成为内联函数,反之不会成为内联函数,因此成不成内联函数完全由编译器说了算.

二.inline的实现(注意debug模式下内联函数不会展开)

既然内联函数可以减小函数的调用开销,那么他是怎么实现的呢?非常简单,我们在所有调用内联函数的地方将其代码展开,这样虽然会使代码的的量增加,但是减少了调用的开销,是一种典型的空间换时间的做法.

我们将编译器调到Release模式下使用内联函数,在汇编指令下就能看见其实现的方式.

源码:

#include<iOStream>
using namespace std;
inline int add(int a, int b) {
	return 0;
}
int main() {
	int b=add(1, 2);
	cout << b << endl;
	return 0;
}

(debug模式)反汇编:

在debug模式下我们可以清楚的看到,在程序运行到add函数时,进行了2和1两个参数的压栈,以及add函数的调用.

(Release模式)反汇编:

此时我们可以看到,像之前的那种参数压栈,函数调用没有了,那就是内联函数,实现成功了,在这里不会再继续调用add函数了,而是将add函数直接展开,将其代码放在这里直接进行a+b的运算,避免函数的调用,增加其运行效率.

三.使用inline的注意事项

在上面我说到了,使用内联函数是一种消耗空间获得时间的方法,因此我们得把握好其中的度,当程序的规模过大时,其代码的运行的开销已经远远超过我们函数调用的开销时,此时收益非常小,再使用内联函数就没有必要了,并且函数内存在递归或者循环时也不能使用内联函数,编译器也不会将其变为内联函数.

源码:

#include<iostream>
using namespace std;
inline int mul(int a) {//求a的阶乘
	if (a <= 0) {
		return 1;
	}
	return a * mul(a - 1);
}
int main() {
	int b=mul(10);
	cout << b << endl;
	return 0;
}

(Release模式)反汇编:

此时在Release模式的反汇编指令中我们看到mul函数并没有被展开,而是进行了函数调用,说明编译器并没有将其变为内联函数.

四.inline和预处理的区别

我们知道预处理阶段会发生宏替换这一行为,宏替换也就是将代码中用到宏的地方用宏定义的代码或数据与宏进行替换,inline也是将函数中的代码复制到调用内联函数的地方,那么他们有什么区别呢?宏替换只是单纯的替换并不安全,而内联函数在使用的时候,编译器会对内联函数调用的正确性进行判断如果不正确则该操作就不会发生,因此其更加安全,所以在c++中所有的宏代码,都应该使用内联函数进行取代. 

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: C++inline函数的特性你了解吗

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

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

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

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

下载Word文档
猜你喜欢
  • C++inline函数的特性你了解吗
    目录一.inline的作用(内联函数)二.inline的实现(注意debug模式下内联函数不会展开)三.使用inline的注意事项四.inline和预处理的区别总结一.inline的...
    99+
    2022-11-13
  • C++inline函数的特性是什么
    这篇文章给大家分享的是有关C++inline函数的特性是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一.inline的作用(内联函数)我们使用关键字inline和函数定义一起就可以创建一个内联函数,它的作用...
    99+
    2023-06-29
  • C++的继承特性你了解吗
    目录导语:继承作用继承的结果继承方式子类构造赋值兼容规则/向上转换/内存切片多继承虚拟继承总结导语: C++是对C语言的优化和改进,C++之所以优秀的点在于它的特性:抽象、封装、继承...
    99+
    2022-11-13
  • C++的内联函数你了解吗
    目录1.概念2.函数演示3.函数特性总结1.概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。...
    99+
    2022-11-13
  • C语言的strcpy函数你了解吗
    目录strcpy函数原型参数讲解返回值详解函数详解第二个注意点:目标空间必须足够大,以确保能存放源字符串第三个注意点:目标空间必须可变总结strcpy 拷贝字符串到目标地址 函数原...
    99+
    2022-11-13
  • C++中的函数你真的理解了吗
    目录1 概述2 函数的定义及调用3 值传递4 函数的常见形式5 函数的声明6 函数的分文件编写作用:让代码结构更加清晰1.2.3.4.总结1 概述 作用:将一段经常使用的代码进行封装...
    99+
    2022-11-13
  • C++的拷贝构造函数你了解吗
    目录一般情况下的拷贝构造函数:默认拷贝构造函数:浅拷贝和深拷贝:总结拷贝构造函数用以将一个类的对象拷贝给同一个类的另一个对象,比如之前学习过的string类: string s1; ...
    99+
    2022-11-13
  • C++的多态与虚函数你了解吗
    目录多态性虚函数总结多态性 多态性是面向对象程序设计的关键技术之一,若程序设计语言不支持多态性,不能称为面向对象的语言,利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能...
    99+
    2022-11-13
  • C++中类的转换函数你了解吗
    只有接受一个参数(其他参数有默认值的也算)的构造函数才能作为转换构造函数。 在C++中,接受一个参数的构造函数为将类型与该参数相同的值转换为类提供了蓝图。因此,下面的构造函数用于将d...
    99+
    2022-11-13
  • C语言的abs()函数和div()函数你了解吗
    C语言库中提供了许多函数,这样需要计算的时候,可以直接借助库函数,而不用自己重新编写函数。今天就来看一下C语言标准库函数里面的整型函数。 int __cdecl abs(int ...
    99+
    2022-11-13
  • C++的对象特性和友元你真的了解吗
    目录对象特征构造函数和析构函数函数的分类以及调用拷贝构造函数调用时机 构造函数调用规则深拷贝与浅拷贝初始化列表类对象作为类变量静态成员成员变量和成员函数分开储存this指针...
    99+
    2022-11-13
  • C++的多态和虚函数你真的了解吗
    目录一、C++的面试常考点二、阿里真题2.1 真题一(1)虚函数表vtbl(2)构造一个派生类对象的过程(3)析构一个派生类对象的过程2.2 真题二2.3 真题三2.4 真题四2.5...
    99+
    2022-11-13
  • C语言中的柔性数组你了解吗
    目录1.什么是柔性数组2.柔性数组应该如何使用3.柔性数组的替代方案及内存分布对比4.柔性数组有哪些优点总结1.什么是柔性数组 柔性数组就是大小可以变化的数组。 注意跟C99中的变长...
    99+
    2023-05-15
    C语言柔性数组使用 C语言 柔性数组 C语言 数组
  • python的函数参数你了解吗
    目录前言位置传参关键字传参默认参数不定长参数混合使用问题创建时引用时总结前言 python参数类型和参数传递形式多样,相对于其他语言python使用会更加灵活。它传参形式一般分为两种...
    99+
    2022-11-13
  • C语言时间函数的ctime()和gmtime()你了解吗
    目录ctime函数gmtime函数总结函数原型如下: __CRT_INLINE char *__cdecl ctime(const time_t *_Time); __CRT_I...
    99+
    2022-11-13
  • C语言的函数概念与规则你了解吗
    目录一、函数概念1.传入参数2.返回值二、函数参数三、指针函数-函数名指针化1.指针指向其他函数的函数名(标签)效果2.指针指向其他函数的地址效果3.通过二级指针,将一组函数线性化四...
    99+
    2022-11-12
  • 带你了解C++中的sort函数
    目录sort( ) char型数组char型数组总结sort( ) 使用方法: sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填)) 必须加上头文件...
    99+
    2022-11-12
  • C语言中的柔性数组你真的了解吗
    目录柔性数组概念:特点:与指针动态开辟的比较指针动态开辟柔性数组指针动态开辟的缺点总结柔性数组概念: 柔性数组就是一种特殊的数组 它也是结构体最后一个成员 也就是说,它存在结构体最后...
    99+
    2022-11-13
  • 带你了解C++的数组与函数
    目录数组作为函数的参数数组参数的传递机制数组作为函数的参数 传递首地址。 A进行修改,a同时也会进行修改。 数组参数的传递机制 ...
    99+
    2022-11-12
  • TypeScript中的函数和类你了解吗
    目录函数作为参数定义函数函数参数的类型可选类型参数默认值剩余参数this的默认推导函数重载类初始化继承多态成员修饰符总结函数 以下声明了一个函数类型,通过type来定义类型别名,vo...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作