C++ 内联(inline)函数
inline是C++关键字,在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。
在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间的问题,特别的引入了inline修饰符,表示为内联函数。内联函数实质是在调用点将函数展开,从而减少了对堆栈的操作(在堆栈中调用函数较为复杂,直接展开为代码运行效率更高)。
内联函数牺牲了空间但是降低了调用函数时的额外开销,以空间换时间,在大部分情况下时值得的。
内联函数的使用方法
在class之外,多一个inline修饰符。
class A{
private:
/*...*/
public:
/*...*/
int add(int x,int y) {return x+y;}
/*...*/
}
/*
如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上inline,否则就认为不是内联的
*/
inline int A::add(int x,int y){
/*...*/
}
inline int add1(int x,int y){
/*...*/
}
在class之内定义的函数是自动内联的。
class A{
private:
/*...*/
public:
/*...*/
int add(int x,int y) {return x+y;}
/*...*/
}
内联函数的使用规则
inline说明对编译器来说只是一种建议,编译器可以选择忽略这个建议。对于过大的函数,编译器会忽略inline。
关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用,inline函数实质上是一种声明,最好直接将内联函数定义一起放在.h文件中。
使用inline的时机
代码短小(例如只有2、3行)且多次调用。
若函数较大或有递归调用(Recursive functions)则不使用inline。
inline函数与宏函数的差异
宏
宏调用是通过简单文本替换来实现的,不会对参数进行类型检查。
宏的使用是预处理器直接对宏代码进行调用,没有参数压栈、生成相应汇编代码、返回参数等时间花费。
宏可能会产生意想不到的边缘效应,很容易出错,要非常小心优先级的变动。
内联
inline 对编译器来说是一种请求,而不是命令。
C++中的内联机制既具备宏代码的效率,又增加了安全性,可以自由操作类的数据成员,而宏代码无法操作类的私有成员。
例如对于下面代码
#include<iostream>
#define add1(x,y) ((x)+(y)) //宏定义
using namespace std;
inline int add2(int x,int y){ //内联
return x+y;
}
int main()
{
double a=1.0,b=2.0;
printf(" %d \n",add1(a,b));
printf(" %d \n",add2(a,b));
return 0 ;
}
得到结果
0//宏没有对类型检测
3//inline进行了强制类型转化
因而建议在c++中用inline函数代替宏函数
C++ 内联(inline)函数的更多相关文章
- C/C++中内联(inline)函数的优点和缺点
优点 缺点 1. 内联函数代码被放入符号表中,在使用时进行替换,和宏展开一样,效率很高: 1. 不允许过多的代码,代码过多的话会造成大的内存消耗,最好在5行以内: 2. 编绎器在调用一个内联函数,首先 ...
- inline(内联)函数
1,为小操作定义一个函数的好处是: a.可读性会强很多. b.改变一个局部化的实现比更改一个应用中的300个出现要容易得多 c.函数可以被重用,不必为其他的应用重写代码 ...
- C++中的内联成员函数与非内联成员函数
在C++中内联成员函数与非内联成员函数的可以分为两种情况: 1.如果成员函数的声明和定义是在一起的,那么无论有没有写inline这个成员函数都是内联的,如下: using namespace std; ...
- C++如何处理内联虚函数
http://blog.csdn.net/hedylin/article/details/1775556 当一个函数是内联和虚函数时,会发生代码替换或使用虚表调用吗? 为了弄清楚内联和虚函数,让我们将 ...
- c++,内联成员函数
内联成员函数有两程方式实现内联成员函数1)在声名成员函数的同时定义成员函数体2)声明成员函数时,在最前面加上inline关键字在定义成员函数时也在最前面加上inline关键字 建议inline函数在头 ...
- SQL Server进阶(六)表表达式--派生表、公用表表达式(CTE)、视图和内联表值函数
概述 表表达式是一种命名的查询表达式,代表一个有效地关系表.可以像其他表一样,在数据处理中使用表表达式. SQL Server支持四种类型的表表达式:派生表,公用表表达式,视图和内联表值函数. 为什么 ...
- SQL Server 表表达式--派生表、公用表表达式(CTE)、视图和内联表值函数
概述 表表达式是一种命名的查询表达式,代表一个有效地关系表.可以像其他表一样,在数据处理中使用表表达式. SQL Server支持四种类型的表表达式:派生表,公用表表达式,视图和内联表值函数. 为什么 ...
- SQL Server标量函数改写内联表值函数优化案例
问题SQL: SELECT TOP 1001 ha.HuntApplicationID , ha.PartyNumber , mht.Name AS MasterHuntTypeName , htly ...
- 函数内联 inline,__inline,__forceinline
▶ 感谢大佬的总结[http://www.cnblogs.com/xuemaxiongfeng/articles/2464850.html] ● 存储限定符 __inline 与关键字 inline ...
随机推荐
- drf频率源码、自动生成接口文档、JWT
目录 一.drf频率源码分析 二.自动生成接口文档 1 安装依赖 2 设置接口文档访问路径 3 文档描述说明的定义位置 4 访问接口文档网页 三.JWT 1 JWT基本原理 1.1 header 1. ...
- GPO - General GPO Settings(3)
WMI filtering Setting - Differentiating Installation Between Operations and Architecture. WMI SQL Ge ...
- 简单分析 ztree 源码
为了把 SVG标注 代码抽成一个库,我要学习一下 ztree 是怎么写的. 开始正文. 这只是一个很简单的版本,以后可能会详细分析... (function ($) { var settings = ...
- 不知道Linux内核到底长啥样?这幅漫画让你秒懂!
下面给大家分享一个[超全2020Linux学习教程],点击链接免费领取哦~ https://www.magedu.com/?p=84301&preview=true
- springboot(4)Druid作为项目数据源(添加监控)
参考博客:恒宇少年:https://www.jianshu.com/p/e84e2709f383 Druid简介 Druid是一个关系型数据库连接池,它是阿里巴巴的一个开源项目.Druid支持所有JD ...
- 题解 P1201 【[USACO1.1]贪婪的送礼者Greedy Gift Givers】
这一题挺简单的,但是如果是纯模拟的话.会十分麻烦 这里介绍一个\(STL\)映射\(map\) \(map\)的最大优点是可以使用任意数据类型作为数组的下标 \(map\)的定义形式为 map< ...
- Js数组对象的属性值升序排序,并指定数组中的某个对象移动到数组的最前面
需求整理: 本篇文章主要实现的是将一个数组的中对象的属性值通过升序的方式排序,然后能够让程序可以指定对应的数组对象移动到程序的最前面. 数组如下所示: var arrayData= [{name: & ...
- 【vagrant】第一次安装添加box报错:The box failed to unpackage properly....
报错信息 The box failed to unpackage properly. Please verify that the box file you're trying to add is n ...
- pandas之时间数据
1.时间戳Timestamp() 参数可以为各种形式的时间,Timestamp()会将其转换为时间. time1 = pd.Timestamp('2019/7/13') time2 = pd.Time ...
- 在sharepoint 2010创建级联下拉菜单
SPServices是一个jQuery库,它提取SharePoint Web服务,并使其更容易使用.它可以使用不同的Web服务操作提供更有用且很酷的功能.它完全安装在客户端,不需要服务器. 用SPSe ...