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;}
/*...*/
}

内联函数的使用规则

  1. inline说明对编译器来说只是一种建议,编译器可以选择忽略这个建议。对于过大的函数,编译器会忽略inline。

  2. 关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用,inline函数实质上是一种声明,最好直接将内联函数定义一起放在.h文件中。

使用inline的时机

代码短小(例如只有2、3行)且多次调用。

若函数较大或有递归调用(Recursive functions)则不使用inline。

inline函数与宏函数的差异

  1. 宏调用是通过简单文本替换来实现的,不会对参数进行类型检查。

  2. 宏的使用是预处理器直接对宏代码进行调用,没有参数压栈、生成相应汇编代码、返回参数等时间花费。

  3. 宏可能会产生意想不到的边缘效应,很容易出错,要非常小心优先级的变动。

内联

  1. inline 对编译器来说是一种请求,而不是命令。

  2. 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)函数的更多相关文章

  1. C/C++中内联(inline)函数的优点和缺点

    优点 缺点 1. 内联函数代码被放入符号表中,在使用时进行替换,和宏展开一样,效率很高: 1. 不允许过多的代码,代码过多的话会造成大的内存消耗,最好在5行以内: 2. 编绎器在调用一个内联函数,首先 ...

  2. inline(内联)函数

    1,为小操作定义一个函数的好处是:     a.可读性会强很多.     b.改变一个局部化的实现比更改一个应用中的300个出现要容易得多     c.函数可以被重用,不必为其他的应用重写代码     ...

  3. C++中的内联成员函数与非内联成员函数

    在C++中内联成员函数与非内联成员函数的可以分为两种情况: 1.如果成员函数的声明和定义是在一起的,那么无论有没有写inline这个成员函数都是内联的,如下: using namespace std; ...

  4. C++如何处理内联虚函数

    http://blog.csdn.net/hedylin/article/details/1775556 当一个函数是内联和虚函数时,会发生代码替换或使用虚表调用吗? 为了弄清楚内联和虚函数,让我们将 ...

  5. c++,内联成员函数

    内联成员函数有两程方式实现内联成员函数1)在声名成员函数的同时定义成员函数体2)声明成员函数时,在最前面加上inline关键字在定义成员函数时也在最前面加上inline关键字 建议inline函数在头 ...

  6. SQL Server进阶(六)表表达式--派生表、公用表表达式(CTE)、视图和内联表值函数

    概述 表表达式是一种命名的查询表达式,代表一个有效地关系表.可以像其他表一样,在数据处理中使用表表达式. SQL Server支持四种类型的表表达式:派生表,公用表表达式,视图和内联表值函数. 为什么 ...

  7. SQL Server 表表达式--派生表、公用表表达式(CTE)、视图和内联表值函数

    概述 表表达式是一种命名的查询表达式,代表一个有效地关系表.可以像其他表一样,在数据处理中使用表表达式. SQL Server支持四种类型的表表达式:派生表,公用表表达式,视图和内联表值函数. 为什么 ...

  8. SQL Server标量函数改写内联表值函数优化案例

    问题SQL: SELECT TOP 1001 ha.HuntApplicationID , ha.PartyNumber , mht.Name AS MasterHuntTypeName , htly ...

  9. 函数内联 inline,__inline,__forceinline

    ▶ 感谢大佬的总结[http://www.cnblogs.com/xuemaxiongfeng/articles/2464850.html] ● 存储限定符 __inline 与关键字 inline ...

随机推荐

  1. bzoj3381[Usaco2004 Open]Cave Cows 2 洞穴里的牛之二*

    bzoj3381[Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 题意: RMQ问题.序列长度≤25000,问题数≤25000. 题解: 倍增. 代码: #include < ...

  2. 没想到 Google 排名第一的编程语言,为什么会这么火?

    没想到吧,Python 又拿第一了! 在 Google 公布的编程语言流行指数中,Python 依旧是全球范围内最受欢迎的技术语言!   01 为什么 Python 会这么火? 核心还是因为企业需要用 ...

  3. 机器学习 | SVD矩阵分解算法,对矩阵做拆分,然后呢?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题第28篇文章,我们来聊聊SVD算法. SVD的英文全称是Singular Value Decomposition,翻译过来 ...

  4. INS-40718 和 INS - 30516

    RAC  安装的时候报错, INS-40718 这个是自己填写的  scan name 和 /etc/hosts  里定义的不一致  可以cat   /etc/hosts   看一下 INS - 30 ...

  5. maven&nexus_repository 私库搭建与使用

    一.nexus仓库安装 1,http://www.sonatype.org/nexus/    下载sso版本,免费2,tar -zxvf nexus-2.11.1-01-bundle.tar.gz3 ...

  6. MSF查找提权exp

    0x01:介绍 在拿到一个反弹shell后,下一步可以用metaspolit的内置模块Local Exploit SuggesterLocal-exploit-suggester的功能就如它的名字一样 ...

  7. Markdown与LaTex使用语法整合

    Markdown学习 RUNOOB 简介 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档. Markdown 语言在 2004 由约翰·格鲁伯(英语:John Gr ...

  8. 014.Nginx跨域配置

    一 跨域概述 1.1 同源策略 同源策略是一个安全策略.同源,指的是协议,域名,端口相同.浏览器处于安全方面的考虑,只允许本域名下的接口交互,不同源的客户端脚本,在没有明确授权的情况下,不能读写对方的 ...

  9. 服务器入侵应急响应排查(Linux篇)

    总体思路 确认问题与系统现象 → 取证清除与影响评估 → 系统加固 → 复盘整改 常见入侵 ① 挖矿: 表象:CPU增高.可疑定时任务.外联矿池IP. 告警:威胁情报(主要).Hids.蜜罐(挖矿扩散 ...

  10. 关于RecyclerView(二)设置EmptyView

    首先重写一个RecyclerView类 package com.onepilltest.others; import android.content.Context; import android.s ...