【C++】内联函数、auto、范围for
文章目录
- 1.内联函数
- 2.auto关键字
- 2.1auto简介
- 2.2auto的注意事项
- 2.3auto不能推导的场景
- 3.基于范围的for循环(C++11)
- 4.指针空值nullptr(C++11)

1.内联函数
- 概念:
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
下面的代码就是不使用内联函数,会建立栈帧。
如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。
注意:Debug下,默认是不展开的,因为展开以后不方便调试。需要设置编译器。
此时,汇编代码中是没有call指令的,函数展开了。
- 特性
- inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。
- inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
- 如果函数的规模较大(不建议展开),展开以后,编译出来的可执行程序就会变大。
- inline不建议声明和定义分离,分离会导致链接错误。
因为inline被展开,就没有函数地址了,链接就会找不到。
(可以理解为:内联函数没有地址,它已经被展开了)
【面试题】 宏的优缺点?
优点:
- 增强代码的复用性。
- 提高性能。
缺点:
- 不方便调试宏。(因为预编译阶段进行了替换)
- 导致代码可读性差,可维护性差,容易误用。
- 没有类型安全的检查 。
C++有哪些技术替代宏?
- 常量定义 换用const、enum
- 短小函数定义 换用内联函数
2.auto关键字
2.1auto简介
随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在:
- 类型难于拼写
- 含义不明确导致容易出错
有的同学也许也会想到,可以使用typedef 给较长的类型取别名,但是这种方法是有缺陷的,例如:
在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么?
早期的auto关键字虽然是用来声明具有自动存储器的局部变量,但是我不写auto它也是局部的,何必自找麻烦。
C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
typeid
是一个关键字,用来获取一个表达式的类型信息。
注意:
使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
2.2auto的注意事项
- auto与指针和引用结合起来使用
用auto声明指针类型时,用auto和auto * 没有任何区别,但用auto声明引用类型时则必须加&
- 在同一行定义多个变量
当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
2.3auto不能推导的场景
- auto不能作为函数的参数
若auto作为参数,那形参是什么类型呢?编译器是不知道的,编译时就不知道栈帧要开多大
- auto不能直接用来声明数组
- 为了避免与C++98中的auto发生混淆(C++11中被废弃了),C++11只保留了auto作为类型指示符的用法
- auto在实际中最常见的优势用法就是跟C++11提供的新式for循环,还有lambda表达式等进行配合使用。
3.基于范围的for循环(C++11)
- 范围for简介
在C++98中如果要遍历一个数组,可以按照以下方式进行:
对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
要想改变数组中的元素,需要使用引用
注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。
- 范围for的使用条件
- for循环迭代的范围必须是确定的
对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。
注意:以下代码就有问题,因为for的范围不确定
void TestFor(int array[]){for(auto& e : array)//errorcout<< e <<endl;}
4.指针空值nullptr(C++11)
如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化
void TestPtr()
{int* p1 = NULL;int* p2 = 0;// ……
}
NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void)的常量*。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:
程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。
在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0。
-
在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
-
在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
-
为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
相关文章:

【C++】内联函数、auto、范围for
文章目录 1.内联函数2.auto关键字2.1auto简介2.2auto的注意事项2.3auto不能推导的场景 3.基于范围的for循环(C11)4.指针空值nullptr(C11) 1.内联函数 概念: 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函…...

Day 46 139.单词拆分
单词拆分 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s “leet…...
streamlit报错:AxiosError: Request failed with status code 403
解决办法: 步骤一:创建config.toml vi ~/.streamlit/config.toml 步骤二:加入以下内容 [server] enableXsrfProtection false enableCORS false步骤三:重新启动你的streamlit网页...
java基础教学 |Java Stream API详解
Java Stream API 是Java 8引入的一个重要特性,它为集合对象提供了一种新的计算模型,使得开发者能够以声明性的方式处理数据集合。Stream API 不仅提高了代码的可读性和简洁性,还极大地优化了并行处理能力,让复杂的集合操作变得高效…...
0.0和0.00竟然不相等!!!BigDecimal别用错了比较方式
对于BigDecimal字段,可以使用compareTo()方法和equals()方法进行比较。但是要注意这两种方法的作用有所不同。一般都应该使用BigDecimal比较值,而不是使用经常用到的equals方法比较内容。 1.compareTo()方法 是用来比较两个BigDecimal对象的大小关系。…...

【多模态】30、Monkey | 支持大尺寸图像输入的多任务多模态大模型
文章目录 一、背景二、方法2.1 Enhancing Input Resolution2.2 Multi-level Description Generation2.3 Multi-task Training 三、效果3.1 Image Caption3.2 General VQA3.3 Scene Text-centric VQA3.4 Document-oriented VQA3.5 消融实验3.6 可视化 论文:Monkey : …...

PHP黑魔法之md5绕过
php本身是一种弱语言,这个特性决定了它的两个特点: 输入的参数都是当作字符串处理变量类型不需要声明,大部分时候都是通过函数进行类型转化php中的判断有两种: 松散比较:只需要值相同即可,类型不必相同,不通类型比较会先转化为同类型,比如全数字字符串和数字比较,会比…...

【适用全主题】WordPress原创插件:弹窗通知插件 支持内容自定义
内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 适用于所有WordPress主题的弹窗插件 一款WordPress原创插件:弹窗通知插件 支持内容自定义 二、效果展示 1.部分代码 代码如下(示例)࿱…...

定时器的理论和使用
文章目录 一、定时器理论1.1定时器创建和使用 二、定时器实践2.1周期触发定时器2.2按键消抖 一、定时器理论 定时器是一种允许在特定时间间隔后或在将来的某个时间点调用回调函数的机制。对于需要周期性任务或延迟执行任务的嵌入式应用程序特别有用。 软件定时器: …...

【架构-17】通信系统架构设计理论
通信系统网络架构 1. 局域网网络架构 拓扑结构:星型、总线型、环型、树型。 网络架构:单核心架构(结构简单,地理范围受限)、双核心架构(网络拓扑结构可靠,投资较单核高)、环型架构…...

网络中的基本概念
网络初识 局域网:把若干个电脑组成在一起,通过路由器进行组网。 广域网:把局域网进一步的连接,构成更复杂的网络体系。 IP地址:区分主机。 端口号:区分主机上不同的程序。 协议:是一种约定&…...

手撸XXL-JOB(二)——定时任务管理
在上一节中,我们介绍了SpringBoot中关于定时任务的执行方式,以及ScheduledExecutorService接口提供的定时任务执行方法。假设我们现在要写类似XXL-JOB这样的任务调度平台,那么,对于任务的管理,是尤为重要的。接下来我们…...

DEV--C++小游戏(吃星星(0.2))
目录 吃星星(0.2) 简介 本次更新 分部代码 头文件(增) 命名空间变量(增) 副函数(新,增) 清屏函数 打印地图函数(增) 移动函数 选择颜色…...
Lua 协程池
协程池 在 使用 Lua 协程模拟 Golang 的 go defer 编程模式 中介绍了 Lua 协程的使用,模仿 golang 封装了下 还可以做进一步的优化 原来的 go 函数是这样实现的: function go(_co_task)local co coroutine.create(function(_co_wrap)_co_task(_co_w…...

[Linux][网络][协议技术][DNS][ICMP][ping][traceroute][NAT]详细讲解
目录 1.DNS1.DNS背景2.域名简介 2.ICMP协议1.ICMP功能2.ICMP两类报文 3.ping命令4.traceroute5.NAT技术1.NAT技术背景2.NAT IP转换过程3.静态地址NAT && 动态地址NAT4.网络地址端口转换NAPT5.NAT技术的缺陷6.NAT和代理服务器 6.总结1.数据链路层2.网络层3.传输层4.应用…...

Android 集成Bugly完成线上的异常Exception收集及处理
文章目录 (一)添加产品APP(二)集成SDK(三)参数配置权限混淆 (四)初始化 (一)添加产品APP 一)在个人头像 -> 我的头像 -> 新建产品 二&…...
Redis——Redis的数据库结构、删除策略及淘汰策略
Redis是一个高性能的key-value存储系统,它支持多种数据结构,并提供了丰富的删除策略和淘汰策略。以下是关于Redis的数据库结构、删除策略及淘汰策略的详细介绍: Redis的数据库结构 Redis是一个key-value数据库,数据存储是以一个…...
【Vue3笔记03】Vue3项目工程中使用vue-router路由
这篇文章,主要介绍Vue3项目工程中如何使用vue-router路由。 目录 一、vue-router路由 1.1、下载vue-router路由 1.2、创建router.js文件 1.3、main.js配置路由...

并行执行的4种类别——《OceanBase 并行执行》系列 4
OceanBase 支持多种类型语句的并行执行。在本篇博客中,我们将根据并行执行的不同类别,分别详细阐述:并行查询、并行数据操作语言(DML)、并行数据定义语言(DDL)以及并行 LOAD DATA 。 《并行执行…...
函数练习.
1.打印乘法口诀表 口诀表的行数和列数自己指定如:输入9,输出99口诀表,输出12,输出1212的乘法口诀表。 multiplication(int index) { if (index 9) { int i 0; for (i 1; i < 10; i) { int j 0; for (j 1; j &…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...
触发DMA传输错误中断问题排查
在STM32项目中,集成BLE模块后触发DMA传输错误中断(DMA2_Stream1_IRQHandler进入错误流程),但单独运行BLE模块时正常,表明问题可能源于原有线程与BLE模块的交互冲突。以下是逐步排查与解决方案: 一、问题根源…...

CCF 开源发展委员会 “开源高校行“ 暨红山开源 + OpenAtom openKylin 高校行活动在西安四所高校成功举办
点击蓝字 关注我们 CCF Opensource Development Committee CCF开源高校行 暨红山开源 openKylin 高校行 西安站 5 月 26 日至 28 日,CCF 开源发展委员会 "开源高校行" 暨红山开源 OpenAtom openKylin 高校行活动在西安四所高校(西安交通大学…...

Linux——TCP和UDP
一、TCP协议 1.特点 TCP提供的是面向连接、可靠的、字节流服务。 2.编程流程 (1)服务器端的编程流程 ①socket() 方法创建套接字 ②bind()方法指定套接字使用的IP地址和端口。 ③listen()方法用来创建监听队列。 ④accept()方法处理客户端的连接…...