C++ inline的详解
1、inline的作用
在C++中,为了解决一些频繁调用的小函数大量消耗栈内存问题,特别的引入了inline修饰符,表示为内联函数。
栈空间是指防止程序局部数据的内存空间。在系统下,栈空间是有限的,如果频繁大量的使用就会造成因栈空间不足而导致程序出错的问题。
在程序编译时,编译器将程序中出现的内联函数调用表达式用内联函数的函数体进行替代,类似于宏展开。如:
int min ( int v1, int v2)
{return (v1< v2 ? v1: v2);
}//代码编写时,是直接按照函数名进行调用
int minval2 = min(i,j);//实际编译之后,把函数体内部代码进行替换
int minval2 = i < j ? v1: v2;
2、内联函数的好处
最大的好处当然是提高函数的执行效率,内联函数实际上使用空间换取时间的做法,以代码复制为代价,省去了函数调用的开销,从而提升执行效率。下面总结一下其他好处:
- 如果一段代码包含min()的调用,那阅读这样的代码并解释其含义比读一个条件操作符的实例,可读性要强很多。
- 改变一个局部化的实现比更改一个应用中的300个出现要容易的多。
- 语义是统一的,每个测试都能保证相同的实现方式。
- 函数可以被重用,不必为其它的应用重写代码。
3、inline的使用
inline有这么大的好处,但是使用也有相应的规则:
- inline 只适用于函数体内代码简单的函数,不能包含复杂的结构控制语句,如while、switch,并且内联函数本身不能是递归函数
- inline函数仅仅是对编译器的建议,最后能否真正的内联,决定在编译器。
- inline关键字必须与函数定义体放在一起才能使函数成为内联。仅将inline放在函数声明前,不起任何作用。
- 建议:因为上一条的原因,最好将内联函数的定义放在头文件里。
4、类与inline函数
定义在类中的成员函数缺省都是内联的。如果在类中未给出成员函数定义,而又想内联该函数的话,需要在类外加上inline。如:
class myclass
{
public:int Add(int x, int y ){ return x+y; }; //自动成为内联函数
}
将成员函数的定义放在类声明之中,虽然书写方便,但不是一种良好的编程风格,上面可改为:
class myclass
{
public:int Add(int x, int y);
};//实现文件
inline int A::Foo(int x, int y ){ return x+y; };
虽然理论是这样的,但是在VS中使用这样的类成员函数,链接器会报错。所以最好还是写在头文件中。
virtual函数不能是inline的,virtual意味着知道运行期才确定调用哪个函数,而inline意味着执行前,先将调用动作替换为被调用函数的本体。
5、inline和宏的区别
通过前面的介绍,你可能也发现了,inline和宏很相似,但是他们有什么差别吗?其实inline就是用来替换宏定义的。下面就对两者就行整理:
相同点:
- 通过替换或展开,没有了函数调用相关的操作,提高了效率
不同点:
- 宏定义容易产生二意形,inline函数不会
- 宏定义是在预处理阶段进行的替换,inline函数是在编译阶段进行替换
- 宏定义只是简单的替换,而inline是函数,编译器会进行严格的类型和作用域检查,保证调用正确。消除了它的隐患和局限性。
- 宏定义不能用于类成员,没有this指针的位置,而inline可以用于类成员。
6、总结
内联函数并不是一个增强性能的灵丹妙药。只有当函数非常短小的时候它才能得到我们想要的效果。但是,如果函数并不是很短而且很多地方被调用的话,那么将会使得可执行程序体积增大。所以如果内联函数不能增强性能,就避免使用它!
再提一点:在release调试的时候,inline函数断点是无效的,毕竟你相当于在一个不存在的函数内设断点。在debug版本下没有问题,因为debug版本程序禁止发生inlining。
感谢大家,我是假装很努力的YoungYangD(小羊)。
参考资料:
https://blog.csdn.net/hejjunlin/article/details/78239277
https://www.cnblogs.com/fnlingnzb-learner/p/6423917.html
C++ inline的详解相关推荐
- 内联函数(inline 函数)详解
inline 函数详解 定义 内联函数和普通函数一样,区别仅仅是在被调用处直接使用机器码替换的形式. 直接采用机器码替换的目的是:减少因调用而造成的开销,加速执行效率. 很多编程语言包括:c,c++, ...
- inline用法详解
(一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int ...
- c语言 inline函数的总结,C++中inline函数详解
本文主要记录了C++中的inline函数,也就是内联函数,主要记录了以下几个问题: 一.C++为什么引入inline函数? 主要目的:用它代替C语言中表达式形式的宏定义来解决程序中函数调用的效率问题. ...
- 内联函数(inline)详解
为什么要有内联函数 在学习内联函数之前,大家可以写一个实现加法的宏ADD(),检测一下自己. 如果对宏等预编译知识不太熟悉的话,可以先看一下这篇文章:预编译--2.2.4 以下是一个正确的ADD宏: ...
- inline函数返回值_C++ inline关键字详解
当程序执行函数调用指令时,CPU将存储该函数调用后指令的内存地址,将函数的参数复制到堆栈上,最后将控制权转移到指定的函数.然后,CPU执行函数代码,将函数返回值存储在预定义的内存位置/寄存器中,并将控 ...
- C++ inline用法详解
在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int secend) {/****/}; 1.1inline定义 ...
- 、简述global关键字的作用_详解static inline关键字
详解static inline关键字 本文章为知乎用户 @徐yang哟 原创,禁止抄袭! 灵感来源 在查stm32的LL库部分函数的API时,有时会查到这种函数: __STATIC_INLINE vo ...
- [CSS]详解display:inline | block |inline-block的区别
2019独角兽企业重金招聘Python工程师标准>>> [CSS]详解display:inline | block |inline-block的区别[点评网站][发布新闻][申请专栏 ...
- Rocksdb 写流程,读流程,WAL文件,MANIFEST文件,ColumnFamily,Memtable,SST文件原理详解
文章目录 前言 Rocksdb写流程图 WAL 原理分析 概述 文件格式 查看WAL的工具 创建WAL 清理WAL MANIFEST原理分析 概述 查看MANIFEST的工具 创建 及 清除 MANI ...
最新文章
- 复习--linux目录及文件操作
- 【数学基础】最小二乘法
- (213)initial是否可综合?
- 【推荐系统】BERT4Rec:使用Bert进行序列推荐
- ubuntu下NS2+leach算法安装笔记(1)
- b类 蚂蚁金服_蚂蚁金服开放平台 - 文档中心
- 理解什么叫“自然拼读”
- 腾讯提出共享 AI,抢先布局游戏与多媒体 AI,首秀同声传译
- 再说Mdx的字典文件处理
- 红帽6虚拟机安装流程
- Rsync 服务部署与参数详解
- Mac下brew的安装
- nginx 配置优化的几个参数
- 小米手机MIUI系统MIX4屏下光电指纹解锁时闪屏解决步骤办法
- SOLID设计原则解读
- java 虚拟机(jvm)-06-JVM jdk 自带工具 jstack jconsole jvisualvm jmap jinfo
- show master status 时没有数据显示
- Chrome 升级成最新v33 造成开发上面诸多不便,赶紧回滚v32
- 我不想你触及,我眼里的忧伤
- 核心交换机、汇聚交换机、接入交换机
热门文章
- leetcode动态规划刷题总结
- 博客同步工具BlogSync
- PHP sm2 国密扩展
- 又上锁妖塔(洛谷:P2800)
- 深度学习环境配置 (Ubuntu18.04 + CUDA10.0 + cuDNN7.6.5 + TensorFlow2.0)
- 配置描述文件web clip-iOS技巧:不越狱在主屏创建快速拨打图标
- 爱礼(爱的礼物——谐音爱你),开源项目送给你对象的爱的礼物
- php5怎么下载,【后端开辟】php5怎样下载
- CSS中的外边距折叠问题及其4种解决方法总结(完整版)
- “吃饭行情”是不是还没开始吃,你就要开始买单了