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. 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:我年龄的立方是个4位数。 我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。” 请你推算一下,他当时到底有多年轻。 结果只有一个数。

    #include<stdio.h>int main(){ int age=1; int san=0; int si=0; int sum=0; while(age>0) { san= ...

  2. 并发编程之synchronized(二)------jvm对synchronized的优化

    一.锁的粗化 看如下代码 public class Test { StringBuffer stb = new StringBuffer(); public void test1(){ //jvm的优 ...

  3. 转载一篇关于kafka零拷贝(zero-copy)通俗易懂的好文

    原文地址 https://www.cnblogs.com/yizhou35/p/12026263.html 零拷贝就是一种避免CPU 将数据从一块存储拷贝到另外一块存储的技术. DMA技术是Direc ...

  4. SpingBoot整合jxls2.0-excel导出—— 列表循环,自定义方法,超链接等

    Java中实现excel导出数据的方法有很多,一般简单的可以通过操作POI进行,但是复杂的excel格式导出如果用POI就显得非常麻烦,本文介绍的jxls2.0完全依据模板进行导出,只需要进行简单的配 ...

  5. 毕业三年从月薪6K到20K

    首先,声明这不是标题党,是一个真实的北漂故事!     为什么写这篇文章呢?第一,有感而发,感恩遇到的人和事,其次,希望对读这篇文章的你有所帮助 毕业那年 时间追溯到17年6月30号,那天毕业典礼,之 ...

  6. Python Ethical Hacking - VULNERABILITY SCANNER(9)

    Automatically Discovering Vulnerabilities Using the Vulnerability Scanner 1. Modify the run_scanner ...

  7. 机器学习实战---K均值聚类算法

    一:一般K均值聚类算法实现 (一)导入数据 import numpy as np import matplotlib.pyplot as plt def loadDataSet(filename): ...

  8. Python3基础语法快速入门

    01 Python 简介 Python 是一种高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python 由 Guido van Rossum 于 1989 年底在荷兰国家数学和计算机科学 ...

  9. JavaSE基础知识之修饰符和使用场景,你真的了解嘛

    修饰符的作用是啥? 用来定义类.方法或者变量的访问权限 两大类 访问修饰符 限定类.属性或方法是否可以被程序里的其他部分访问和调用的修饰符 private<default<protecte ...

  10. Python快速入门PDF高清完整版免费下载|百度云盘

    百度云盘:Python快速入门PDF高清完整版免费下载 提取码:w5y8 内容简介 这是一本Python快速入门书,基于Python 3.6编写.本书分为4部分,第一部分讲解Python的基础知识,对 ...