C++解析(5):内联函数分析
0.目录
1.常量与宏回顾
2.内联函数
3.内联函数深度探析
4.注意事项
5.小结
1.常量与宏回顾
C++中的const常量可以替代宏常数定义,如:
const int A = 3; <——> #define A 3
C++中是否有解决方案替代宏代码片段呢?
在C语言中讲过,宏是C语言里面的一种程序的单元。这种程序的单元是非常特别的,它不是由编译器来处理,是由预处理器来处理。
比如说以上这个例子,右边是一个宏定义,定义了一个宏常数,当我们在程序里面使用这个宏常数A的时候,其实等价于使用了3,编译器编译的时候,首先预处理器出场,将程序里面的所有大写字母A进行文本替换,替换为3。这种文本替换是不会进行任何的语法检查或者语义检查的,仅仅就是复制粘贴的过程。也就是说后续出场的编译器根本不知道宏这种东西的存在。
当然,这是有副作用的,宏的副作用在于没有类型检查,所以说,在C++里面,就将const进行了升级,由const所定义的常量就成为了真正意义上的常量,所以在C++中如果我们要使用宏常数,我们就可以直接通过const定义的常量来替换宏常数。
既然const经过升级可以用来替换宏常数了,那我们知道通过#define还可以定义宏代码块,那在C++中是不是有什么解决方案可以来替换宏代码块呢?当然是有的,就是内联函数的提出。
2.内联函数
- C++中推荐使用内联函数替代宏代码片段
- C++中使用inline关键字声明内联函数

内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。
- C++编译器可以将一个函数进行内联编译
- 被C++编译器内联编译的函数叫做内联函数
- C++编译器直接将函数体插入函数调用的地方
- 内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)
C++编译器不一定满足函数的内联请求!
3.内联函数深度探析
- 内联函数具有普通函数的特征(参数检查,返回类型等)
- 函数的内联请求可能被编译器拒绝
- 函数被内联编译后,函数体直接扩展到调用的地方
宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程,因此可能出现副作用。
现代C++编译器能够进行编译优化,一些函数即使没有inline声明,也可能被内联编译
一些现代C++编译器提供了扩展语法,能够对函数进行强制内联,如:
- g++:
__attribute__((always_inline))属性 - MSVC:
__forceinline
(直接用__attribute__((always_inline))或者__forceinline代替原来的普通的inline关键字即可。)
4.注意事项
C++中inline内联编译的限制:
- 不能存在任何形式的循环语句
- 不能存在过多的条件判断语句
- 函数体不能过于庞大
- 不能对函数进行取址操作
- 函数内联声明必须在调用语句之前
5.小结
- C++中可以通过inline声明内联函数
- 编译器直接将内联函数体扩展到函数调用的地方
- inline只是一种请求,编译器不一定允许这种请求
- 内联函数省去了函数调用时压栈,跳转和返回的开销
C++解析(5):内联函数分析的更多相关文章
- C++中的内联函数分析
1,本节课学习 C++ 中才引入的新的概念,内联函数: 2,常量与宏回顾: 1,C++ 中的 const 常量可以替代宏常数定义,如: 1,const int A = 3; <==> #d ...
- 3.C++内联函数,默认参数,占位参数
本章主要内容: 1)内联函数(替代宏代码段) 2)默认参数 3)占位参数 1.C++的内联函数分析 1.1讲解内联函数之前,首先回忆下之前讲的define宏定义: 之前讲过宏定义会经过预处理器进行文本 ...
- C++解析四-友员函数、内联函数、静态成员
友元函数 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员.尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数.友元可以是一个函 ...
- 内联函数 —— C 中关键字 inline 用法解析
一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗. 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放 ...
- c++内联函数解析(inline)
一.基本定义 inline是C++语言中的一个关键字,可以用于程序中定义内联函数,inline的引进使内联函数的定义更加简单.说到内联函数,这里给出比较常见的定义,内联函数是C++中的一种特殊函数,它 ...
- 【转载】内联函数 —— C 中关键字 inline 用法解析
转载地址:https://blog.csdn.net/zqixiao_09/article/details/50877383 一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈, ...
- C++内联函数
在C语言中,我们使用宏定义函数这种借助编译器的优化技术来减少程序的执行时间,那么在C++中有没有相同的技术或者更好的实现方法呢?答案是有的,那就是内联函数.内联函数作为编译器优化手段的一种技术,在降低 ...
- 特殊用途语言特性——默认参数、内联函数和constexptr函数
1 默认实参 某些函数有这样一些参数,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参.调用含有默认实参的函数时,可以包含该实参,也可以省略该实参. 我们可 ...
- C++ primer(八)--内联函数 引用变量 引用传递函数参数 函数重载/模板/模板具体化
一.内联函数 常规函数和内联函数的区别在于C++编译器如何将他们组合到程序中.编译过程的最终产品是可执行程序--由一组机器语言指令组成.运行程序时,操作系统将这些指令载入到计算机内存中,因此每 ...
随机推荐
- Oracle的物理存储与逻辑存储关系对应
逻辑结构: TableSapce 由 多个 Segment组成 Sgement 由多个 Extent 组成 Extent 由 多个数据块组成 物理结构: 一个Tablespace 可以包括多个数据文件 ...
- 【转载】从零实现3D图像引擎:(1)环境配置与项目框架
原文:从零实现3D图像引擎:(1)环境配置与项目框架 0. 要学懂3D程序设计,必然要精通3D相关的线性代数.3D几何.复分析等相关知识,我也因为如此才开始这个博客系列的写作,不自己实现,就不是自己的 ...
- 3-3 修改haproxy配置文件
1.需求 2.个人思路 3.个人心得 4.
- C#之Ref,Out以及TryParse()的用法
ref和out用法很简单,我记下来也提醒自己要用更好的方式去写代码,不要让代码过于臃肿,让人看得头痛.直接写 ref:ref关键字就是让参数进行传递,但是需要初始化,而out不需要初始化参数 ref用 ...
- power sequece
- 移动端车牌识别/车牌OCR识别
周末,小编约了朋友商场shopping. 开车进地下车库时,“滴”的一声,完成车牌录入:开车离开时,扫描二维码,输入车牌,完成停车收费.小编不禁感叹科技改变生活,人工智能给生活带来的便利. 车牌自动识 ...
- selenium+python 搭建自动化环境
一.以搭建windows平台为例 准备工具如下: 1)下载Python 2)安装,配置环境变量 3)安装selenium,通过pip安装,命令如下: pip install selenium 方式二 ...
- 存储过程关于LOOP循环问题
本随笔文章,由个人博客(鸟不拉屎)转移至博客园 发布时间: 2018 年 10 月 17 日 原地址:https://niaobulashi.com/archives/procedures_loop. ...
- P,V操作及同步互斥实例
无论是计算机考研.计算机软件水平考试.计算机操作系统期末考试还是其他计算机岗位考试,P.V原语操作都是一个常考点.下面笔者总结了关于P.V操作的一些知识. 信号量是最早出现的用来解决进程同步与互斥问题 ...
- [寒假学习笔记](一)Markdown语法学习
Markdown 学习 在博客园上使用markdown编辑,记录学习进度,以来日可以复习 前期准备 1. 安装markdownpad2 官网直接找下载安装,遇到bug他会自动提示信息,跟着提示去安装一 ...