C++:inline
inline
inline
是C++提供的一个关键字,它用于函数定义之前,表示把函数定义为内联函数。内联函数的含义是:在函数调用点把函数体直接展开,取代函数调用。
inline int getZero() {
return 0;
}
int a = getZero();
如果上述函数没有定义为inline
,那么在声明a
时,程序实际上的工作是,把getZero()
函数压入栈中,执行函数得到返回值0并出栈,最后把0赋值给a
。在定义为inline
之后,编译器会把作为内联函数的函数体在调用点,也就是在声明a
时展开,直接得到结果0并赋值给a
,省去了函数入栈和出栈的调用过程,提升了性能。
那么如果是复杂一点的内联函数呢?
inline int get(int a, int b, int c, int x) {
return (a * x + b) * x +c;
}
int b = get(1, 2, 1, 4);
比起之前的getZero()
,get()
函数多了许多运算,它在调用点也会被展开为int b = (1 * 4 + 2) * 4 + 1;
。可想而知,越复杂的函数体内联展开越困难。
由此也引出了内联函数定义的特点:
inline
关键字对编译器起建议作用,是否内联编译由编译器决定。inline
关键字出现在函数声明处不起作用,出现在函数定义时有效。- 把逻辑复杂的函数定义为内联是无意义的,如嵌套调用、递归等。
- 类内定义的函数都是隐式内联的,类外定义需要显式加上
inline
关键字。
// inline无意义
inline int f1(int x) {
if (x == 0 || x== 1) return 1;
return f(x - 1) + f(x - 2);
}
// inline无意义
inline int f2();
class LiF {
public:
LiF() = default;
LiF(int _lif);
void set(int _lif) { lif = _lif; } // 类内隐式内联
int get();
private:
int lif;
}
LiF::LiF(int _lif): lif(_lif) {} // 无内联
inline int LiF::get() { return lif; } // 类外显式内联
既然内联可以提高效率,那为什么不把所有函数都定义为内联呢?这个问题也不难解答。内联的前提是可以在调用点展开,显然之前提到的复杂函数时无法展开的;而如果某次内联函数执行消耗的时间远长于调用的消耗,那么这次内联也是失败的。再者,程序效率提升的背后必然有更大的内存消耗,内联带来的效率提升是通过复制代码到调用点实现的,这显然就增加了代码量。那么这就要求程序员谨慎地使用inline
。
C++:inline的更多相关文章
- 重构改善既有代码设计--重构手法13:Inline Class (将类内联化)
某个类没有做太多事情.将这个类的所有特性搬移到另一个类中,然后移除原类. 动机:Inline Class (将类内联化)正好于Extract Class (提炼类)相反.如果一个类不再承担足够责任.不 ...
- C/C++编程笔记:inline函数的总结!C/C++新手值得收藏!
在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间. 在系统下, ...
- display:inline、block、inline-block 的区别
一.块级元素 与 行级元素 要理解display:inline.block.inline-block的区别,需要先了解HTML中的块级(block)元素和行级(inline)元素的特点,行内元素也叫 ...
- effective c++:inline函数,文件间编译依存关系
inline函数 inline函数可以不受函数调用所带来的额外开销,编译器也会优化这些不含函数调用的代码,但是我们不能滥用Inline函数,如果程序中的每个函数都替换为inline函数那么生成的目标文 ...
- C++的优秀特性2:inline 函数
(转载请注明原创于潘多拉盒子) Inline函数是C++的一个很小的特性,在不计较效率的情况下,这个特性似乎可有可无.然而,C++天生是为最为广泛的应用场景设计的,因此,总会有关于效率的问题.其实,除 ...
- c语言: inline(gcc)
从汇编的角度看inline函数与非inline函数http://blog.csdn.net/cxmanzhao/article/details/6801786 强制内联和强制不内联http://blo ...
- css 小知识点:inline/inline-block/line-height
inline: 此元素会被显示为内联元素,元素前后没有换行符.因此:无法设置宽度和高度- inline-block: 行内块元素.元素前后没有换行符(CSS2.1 新增的值) 用通俗的话讲,就是不独占 ...
- 重构改善既有代码设计--重构手法02:Inline Method (内联函数)& 03: Inline Temp(内联临时变量)
Inline Method (内联函数) 一个函数调用的本体与名称同样清楚易懂.在函数调用点插入函数体,然后移除该函数. int GetRating() { return MoreThanfiveLa ...
- CPP-基础:inline
背景: 在C&C++中 一.inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 表达式形式的宏定义一例: #define ExpressionNam ...
随机推荐
- MySQL 8.0.18安装教程(windows 64位)
目录 1-先去官网下载点击的MySQL的下载 2-配置初始化的my.ini文件的文件3-初始化MySQL4-安装MySQL服务 + 启动MySQL 服务5-连接MySQL + 修改密码 * 第一项 ...
- codeforces #579(div3)
codeforces #579(div3) A. Circle of Students 题意: 给定一个n个学生的编号,学生编号1~n,如果他们能够在不改变顺序的情况下按编号(无论是正序还是逆序,但不 ...
- maven 学习---Maven 构建配置文件
什么是构建配置文件? 构建配置文件是一组配置的集合,用来设置或者覆盖 Maven 构建的默认配置.使用构建配置文件,可以为不同的环境定制构建过程,例如 Producation 和 Developmen ...
- Android源码分析(一)-----如何快速掌握Android编译文件
一 : Android.mk文件概述 主要向编译系统指定相应的编译规则.会被解析一次或多次.因此尽量减少源码中声明变量,因为这些变量可能会被多次定义从而影响到后面的解析.这个文件的语法会把源代码组织成 ...
- 苹果审核之遇到IPV6问题被拒的解决方法
情景: 等待苹果审核上线时,发现因为IPV6被拒了.这是悲剧,以下是苹果审核给我的理由: We discovered one or more bugs on Wi-Fi connected to an ...
- 如何在unbuntu 16.04上在线安装vsftpd
本文涉及命令如下: # service vsftpd status //查询vsftp服务状态 # apt-get remove vsftpd //卸载vsftpd # apt-get install ...
- sql developer 17002报错无法连接
问题登场: 使用sql developer 登录oracle 时报错,错误码17002 解决办法: 右键,点击properties 属性,检查每一项配置,发现ip 是之前的ip,更改为database ...
- layer.js的一些常用的技巧
我们在一些弹出框或者其他的一些表单的样式逻辑当中会用到layer的组件,针对我遇到的问题做个小结 1.在使用checkbox进行多选的时候,默认的layer会有一个对勾的样式,但是我们通常在做单选或者 ...
- sqlalchemy(2)
orm介绍 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为 ...
- 如何防止XSS攻击?
来自: https://www.freebuf.com/articles/web/185654.html 前端安全 随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一,而前端又是引发企业 ...