C++ · 入门 · 05 | 内联函数

news2024/11/17 17:43:20

在这里插入图片描述
啊我摔倒了..有没有人扶我起来学习....


👱个人主页: 《 C G o d 的个人主页》 \color{Darkorange}{《CGod的个人主页》} CGod的个人主页》交个朋友叭~
💒个人社区: 《编程成神技术交流社区》 \color{Darkorange}{《编程成神技术交流社区》} 《编程成神技术交流社区》加入我们,一起高效学习,收割好Offer叭~
🌱刷题链接: 《 L e e t C o d e 》 \color{Darkorange}{《LeetCode》} LeetCode快速成长的渠道哦~


目录

  • 前言
  • 一、概念
  • 二、特性
  • 三、尽量以const,enum,inline替换#define
    • 3.1 宏的缺陷
    • 3.2 解决方案


前言

  • 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率

一、概念

在这里插入图片描述

  • 如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用
  • 查看方式:
    1. 在release模式下,查看编译器生成的汇编代码中是否存在call Add
    2. 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2019的设置方式)
      在这里插入图片描述
      在这里插入图片描述

二、特性

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率
  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。下图为《C++prime》第五版关于inline的建议:
    在这里插入图片描述
  3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到

三、尽量以const,enum,inline替换#define

  • 这是博主在《Effective C++》看到的一个条款,在此简化表述以下,希望对铁汁们有帮助

3.1 宏的缺陷

  1. 宏没有类型安全检查
  2. 宏的可读性较差,特别是所谓的宏函数:
#define Add(x,y) ((x)+(y))

以上宏函数定义很容易招来许多错误,比如:
(1)缺少外面的括号

#define Add(x,y) (x)+(y)

在这种场景下就会出错:

int main()
{
	Add(x,y)*2;//宏替换后=>x+y*2
	return 0;
}

(2)缺少里面的括号

#define Add(x,y) (x+y)

在这种场景下就会出错:

int main()
{
	Add(a&b,a|b);//宏替换后=>a&b+a|b,+优先级比&和|要高
	return 0;
}
  1. 宏无法调试,在预处理期间就会被替换。比如你用了别人的头文件,其中有#define NUM 10,记号NUM从未被编译器看见,当你遇到错误信息的时候提到10这个数,你会一脸懵逼,不知道从何而来,造成麻烦!

3.2 解决方案

  1. const替换宏常量
const int num = 10;
  1. enum替换宏常量
enum
{
	NUM = 10
}
  1. inline替换宏函数
    因为宏函数的优势就是直接展开了函数内容,省去了栈帧开销,而inline完全能够替代,而且inline修饰的函数的的确确是个函数,可以调试

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SegFormer学习笔记(4)train续2

这次关注一下最关键的东西:用什么网络,用什么数据,预训练数据在哪里呢?为了方便,重新贴一下 train.pyimport torch import argparse import yaml import time import multiprocessing as mp from tabulate import tab…

JVM笔记——根据黑马jvm课程课件+自己总结

JVM一、内存结构1、程序计数器(PC Register)2、虚拟机栈(JVM Stacks)3、本地方法栈(Native Method Stacks)4、堆(Heap)5、方法区(Method Area)6、直接内存二、…

【爬虫】第七部分 scrapy

【爬虫】第七部分 scrapy 文章目录【爬虫】第七部分 scrapy7. scrapy7.1 基本使用7.2 项目的文件结构7.3 response的方法和属性7.4 小案例7.5 scrapy 工作原理7.6 管道的使用7.7 多管道下载7.8 下载分页类型和get请求的使用7.9 下载多层级类型7.10 post请求的使用总结7. scrapy…

清华大学出版——C语言从入门到精通(第4版)

《C语言从入门到精通(第4版)》是清华大学出版社出版的图书,该书从初学者的角度出发,以通俗易懂的语言,丰富多彩的实例,详细介绍了使用C语言进行程序开发需要掌握的各方面知识。《C语言从入门到精通&#xf…

YOLO v8详解

回顾一下YOLOv5 Backbone:CSPDarkNet结构,主要结构思想的体现在C3模块,这里也是梯度分流的主要思想所在的地方;PAN-FPN:双流的FPN,但是量化还是有些需要图优化才可以达到最优的性能,比如cat前后…

VSCode 配置Go环境,弹出警告“golps”等插件要求下载但下载时超时、失去连接等 解决方案

1. 背景: 下载完GO环境和VSCode的GO配套插件后,试图运行hello world程序,此时VSCode弹出警告: 提示有几个go的工具没有下载,于是我点击install 下载: 》下载时报错,一般是出现超时timeout错误…

57 mac 中 SIGINFO 信号, jdk8 支持, 但是 jdk9 不支持?

前言 问题来自于文章 shell脚本 后台启动 程序1 “tail -f log“, ctrl c 导致程序1中断 中的测试用例 Test07Signal2ParentProcess, 可以看到 我当时标记了一个 "todo, not work in hostpostVM9" 然后 问题是这样的, 我同一台机器, 然后 jdk8 带上 SIGINFO 去执行…

【已解决】右键以某应用打开xx文件时,没有“默认”选项怎么办

问题解决方案简单来说详细操作解释问题 右键以某应用打开xx文件时,没有“默认”选项 解决方案 简单来说 在注册表:计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\找到要打开的文件后缀名,删除…

mybatis plus基本使用初体验01

我们都知道MyBatis是目前比较常用的持久层框架;这个框架的使用也是很简单的,我们在使用的时候,只需要关注mapper的接口层和对应的xml文件即可。 但是MyBatis作为一个半自动框架,是需要我们自己手动编写sql语句的,对于…

Linux系统软件安装

在Linux上部署各类软件MySQL数据库管理系统安装部署简介注意MySQL5.7版本在CentOS系统安装安装配置MySQL8.0版本在CentOS系统安装安装配置MySQL5.7版本在Ubuntu(WSL环境)系统安装安装MySQL8.0版本在Ubuntu(WSL环境)系统安装安装To…

Web服务统一身份认证协议设计与实现

单点登录(SSO)是目前比较流行的企业业务整合的解决方案之一,它的机制是在企业网络用户访问企业网站时作一次身份认证,随后就可以对所有被授权的网络资源进行无缝的访问,而不需要多次输入自己的认证信息.Web服务具有松散耦合、语言中立、平台无关性、开放性的特性,通过对集中单点…

Qt扫盲-Qt 属性系统记录

Qt 属性系统记录一、概述二、属性声明三、通过元对象系统读写属性四、简单例子五、动态属性六、对一个类添加额外的属性一、概述 Qt 提供了一个复杂的属性系统,类似于一些编译器供应商提供的系统。然而,作为一个独立于编译器和平台的库,Qt并…

Java基础07——集合

Java基础07——集合一、集合和数组的对比二、ArrayList成员方法三、集合练习1. 添加数字并遍历2. 添加学生对象并遍历学生类测试类输出结果3. 添加用户对象并判断是否存在用户类测试类输出结果4. 添加手机对象并返回要求的数据(返回多个数据)手机类测试类…

【算法】Day06

努力经营当下,直至未来明朗! 文章目录1. BST二叉搜索树的后序遍历序列2. 二叉树中和为某一值的路径(二)[回溯法]3. 字符串的排列 [全排列问题]4. 最小的K个数 [topK问题]普通小孩也要热爱生活! 1. BST二叉搜索树的后序…

IF:6+ 综合分析揭示了一种炎症性癌症相关的成纤维细胞亚型在预测膀胱癌患者的预后和免疫治疗反应方面具有重要意义...

桓峰基因的教程不但教您怎么使用,还会定期分析一些相关的文章,学会教程只是基础,但是如果把分析结果整合到文章里面才是目的,觉得我们这些教程还不错,并且您按照我们的教程分析出来不错的结果发了文章记得告知我们&…

Linux 中断子系统(七):注册中断

Linux 注册中断的 API request_irq():不使用中断线程化request_threaded_irq():使用中断线程化中断线程化 为什么需要将中断下半部处理线程化,原因如下: 中断具有最高优先级,有中断发生时,会抢占进程,导致实时任务不能及时处理。中断上下文总是可以抢占进程上下文,这…

【PyTorch】教程:学习基础知识-(3) Datasets-DataLoader

Dataset & DataLoader PyTorch 提供了两个数据处理的基本方法:torch.utils.data.DataLoader torch.utils.data.Dataset 允许使用预加载的数据集以及自己的数据。 Dataset 存储样本及其对应的标签, DataLoader 在 Dataset 基础上封装了一个可迭代的对…

Python文本颜色设置

Python文本颜色设置实现过程:书写格式:数值表示的参数含义:常见开头格式:实例:实现过程: 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。 转义序…

Acwing4699. 如此编码

某次测验后,顿顿老师在黑板上留下了一串数字 23333 便飘然而去。 凝望着这个神秘数字,小 P 同学不禁陷入了沉思…… 已知某次测验包含 nn 道单项选择题,其中第 i 题(1≤i≤n)有 ai 个选项,正确选项为 bi&…

CAS And Atomic

CAS(Compare And Swap 比较并交换),通常指的是这样一种原子操作:针对一个变量,首先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值,底层是能保证cas是原子性的CAS的应用 在Java 中,CAS 操作…