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++编译器如何将他们组合到程序中.编译过程的最终产品是可执行程序--由一组机器语言指令组成.运行程序时,操作系统将这些指令载入到计算机内存中,因此每 ...
随机推荐
- Qt QStringLiteral
zz 解释QStringLiteral 原文发表于woboq网站 QStringLiteral explained 转载 原作者: Olivier Goffart 译者:zzjin QStringL ...
- CF 96 D. Volleyball
D. Volleyball http://codeforces.com/contest/96/problem/D 题意: n个路口,m条双向路,每条长度为w.每个路口有一个出租车司机,最多可以乘坐这辆 ...
- XDS100V3连接Pandaboard ES OMAP4460开发板
1. 硬件连接如下 2. 使用CCS创建工程,不过好像没有ARM9的内核吧?为啥会出现? 3. 创建目标配置文件 4. 不过确实有ARM9的内核,两个A9内核,一个DSP C64X内核,两个M3的内核 ...
- PostFix使用dovecot支持POP3/IMAP收信
PostFix只能够收发邮件,以及使用SMTP发送邮件,想要使用POP3/IMAP收信的话必须装其他软件,本文通过配置dovecot让邮件服务器支持POP3/IMAP收信.POP3/IMAP是一种收信 ...
- LUIS 语义识别API调用方法
本例使用itchat获取微信文字消息,发送给LUIS返回识别消息,再将返回消息格式化后通过微信发回 关于itchat的使用参考我的另外一篇随笔itchat个人练习 语音与文本图灵测试例程 # -*- ...
- 使用闭包的方式实现一个累加函数 addNum
使用闭包的方式实现一个累加函数 addNum,参数为 number 类型,每次返回的结果 = 上一次计算的值 + 传入的值,如: addNum(10); //10 addNum(12); //22 a ...
- cookie,session傻傻分不清楚?
做了这么多年测试,还是分不清什么是cookie,什么是session?很正常,很多初级开发工程师可能到现在都搞不清什么是session,cookie相对来说会简单很多. 下面这篇文章希望能够帮助大家分 ...
- idea scala 报 with UTF-8 Please try specifying another one using the -encoding option
现象如下图, 代码里有汉字,执行代码报错,说编码格式不对, 修改方式如上面,将右下角的编码格式修改成 u8即可.
- nginx 源码阅读 core
ngx_config.h 数据对齐 #define ngx_align(d, a) (((d) + (a - 1)) & ~(a - 1)) ngx_core.h #define ng ...
- 使用Mininet创建网络拓扑
使用Mininet创建Topo Python脚本实现创建拓扑 #coding:utf-8 from mininet.net import Mininet from mininet.topo impor ...