C++:volatile、const、mutable关键字
文章目录
- `volatile`、`const`、`mutable` 关键字的作用、联系与区别
- 1️⃣ **`volatile`** —— 防止编译器优化,确保变量每次访问都从内存读取
- **作用**
- **使用场景**
- **示例**
- 2️⃣ **`const`** —— 限制变量的修改,保证不可变性
- **作用**
- **使用场景**
- **示例**
- 3️⃣ **`mutable`** —— 允许 `const` 成员变量在 `const` 成员函数中修改
- **作用**
- **使用场景**
- **示例**
- 4️⃣ **`volatile`、`const` 和 `mutable` 的联系与区别**
- **如何组合使用**
- **总结**
volatile、const、mutable 关键字的作用、联系与区别
在 C++ 中,volatile、const 和 mutable 都与变量的存储和访问方式有关,但它们的作用和应用场景不同。
1️⃣ volatile —— 防止编译器优化,确保变量每次访问都从内存读取
作用
volatile告诉编译器 该变量的值可能随时被外部修改(如硬件寄存器、多线程、信号处理),因此每次访问都必须从内存读取,而不能进行优化。- 防止编译器缓存变量的值到寄存器,确保变量每次访问都是最新的。
使用场景
- 多线程编程:防止编译器优化掉
while (!flag)这样的轮询等待。 - 硬件寄存器:嵌入式系统中,访问某些 I/O 端口或寄存器时,数据可能随时变化。
- 中断处理:某些变量可能会被中断函数修改,主程序需要正确读取它们的最新值。
示例
volatile bool flag = false;void waitForEvent() {while (!flag) { // 如果没有 volatile,编译器可能优化掉这个循环,导致死循环// 等待事件发生}
}
2️⃣ const —— 限制变量的修改,保证不可变性
作用
const关键字用于防止变量被修改,可以修饰变量、函数参数、成员函数等。- 提高代码的安全性和可读性,让编译器检查不可变的变量是否被错误修改。
使用场景
- 防止修改变量,例如
const int a = 10;。 - 修饰指针,控制指针本身或指向的内容是否可变。
- 用于成员函数,表示该成员函数不会修改类的成员变量。
示例
const int x = 100; // 变量 x 不能被修改void print(const std::string& str) { // 传递 const 引用,防止修改std::cout << str << std::endl;
}class A {
public:void foo() const { // const 成员函数,不会修改类的成员变量std::cout << "This is a const function." << std::endl;}
};
3️⃣ mutable —— 允许 const 成员变量在 const 成员函数中修改
作用
mutable允许在const类对象或const成员函数内部修改变量。- 适用于缓存、日志计数等需要在
const语境下修改的情况。
使用场景
- 在
const成员函数中修改变量。 - 用于缓存机制,允许
const对象内部修改某些变量(如懒加载)。 - 记录调试信息,如统计
const对象的访问次数。
示例
class Example {
private:mutable int count; // 允许在 const 方法中修改
public:Example() : count(0) {}void access() const {count++; // 即使是 const 方法,仍然可以修改 countstd::cout << "Access count: " << count << std::endl;}
};int main() {const Example obj;obj.access(); // 调用 const 方法,修改 count
}
4️⃣ volatile、const 和 mutable 的联系与区别
| 关键字 | 作用 | 典型场景 | 关键特点 |
|---|---|---|---|
volatile | 防止编译器优化,确保变量每次从内存读取,获取最新的结果 | 多线程、硬件寄存器、中断 | 保证变量值不会被优化,不影响变量是否可修改 |
const | 限制变量的修改,提供只读属性 | 常量、参数传递、成员函数 | 变量或函数不能修改数据 |
mutable | 允许 const 类对象中的某些变量可修改 | 缓存、日志计数 | 仅影响 const 语境下的修改权限 |
如何组合使用
-
volatile const- 变量不能被代码修改,但可能被外部修改(如硬件寄存器)。
volatile const int status = 0x4000; // 只读变量,但可能被外部改变 -
const volatile指针- 指向
const变量的指针,该变量可能随时变化。
const volatile int* ptr; - 指向
-
mutable与const成员函数- 允许
const方法修改mutable变量:
- 允许
class Example {
private:mutable int count; // 允许在 const 方法中修改
public:Example() : count(0) {}void access() const {count++; // 即使是 const 方法,仍然可以修改 countstd::cout << "Access count: " << count << std::endl;}
};int main() {const Example obj;obj.access(); // 调用 const 方法,修改 count
}
总结
volatile:防止编译器优化,确保变量每次访问都从内存读取,适用于多线程、嵌入式编程、信号处理。const:限制变量修改,增强安全性,适用于常量、参数传递、成员函数。mutable:允许const成员函数修改变量,适用于缓存、日志计数。
这三个关键字虽然都与变量的存储和访问方式有关,但适用场景和作用不同,在合适的情况下组合使用可以提高代码的安全性和可读性。
相关文章:
C++:volatile、const、mutable关键字
文章目录 volatile、const、mutable 关键字的作用、联系与区别 1️⃣ **volatile** —— 防止编译器优化,确保变量每次访问都从内存读取**作用****使用场景****示例** 2️⃣ **const** —— 限制变量的修改,保证不可变性**作用****使用场景****示例** 3️…...
linux离线安装miniconda环境
1 下载安装包 可以在官网下载最新版 https://www.anaconda.com/download/success#miniconda 或者在软件目录选择合适的版本 https://repo.anaconda.com/miniconda/ 安装包传入离线服务器 ./Miniconda3-py311_24.9.2-0-Linux-x86_64.sh2 运行安装包 ./Miniconda3-py311_24…...
考研408数据结构线性表核心知识点与易错点详解(附真题示例与避坑指南)
一、线性表基础概念 1.1 定义与分类 定义:线性表是由n(n≥0)个相同类型数据元素构成的有限序列,元素间呈线性关系。 分类: 顺序表:元素按逻辑顺序存储在一段连续的物理空间中(数组实现&…...
selenium用例执行过程采集操作形成测试报告上的回复
在代码执行的过程中不断的进行截图,把截图拼接成gif动态图,放在测试报告上 1、每条用例执行启动一个线程,这个线程会每隔0.3秒进行截图 项目下创建一个临时目录video用来存储所有截图以及gif动态图封装不断截图的方法,每隔0.3秒…...
多元数据直观表示(R语言)
一、实验目的: 通过上机试验,掌握R语言实施数据预处理及简单统计分析中的一些基本运算技巧与分析方法,进一步加深对R语言简单统计分析与图形展示的理解。 数据: 链接: https://pan.baidu.com/s/1kMdUWXuGCfZC06lklO5iXA 提取码: …...
【JavaEE】线程安全
【JavaEE】线程安全 一、引出线程安全二、引发线程安全的原因三、解决线程安全问题3.1 synchronized关键字(解决修改操作不是原子的)3.1.1 synchronized的特性3.1.1 synchronized的使用事例 3.2 volatile 关键字(解决内存可见性) …...
HarmonyOS 5.0应用开发——多线程Worker和@Sendable的使用方法
【高心星出品】 文章目录 多线程Worker和Sendable的使用方法开发步骤运行结果 多线程Worker和Sendable的使用方法 Worker在HarmonyOS中提供了一种多线程的实现方式,它允许开发者在后台线程中执行长耗时任务,从而避免阻塞主线程并提高应用的响应性。 S…...
华为OD-2024年E卷-分批萨[100分]
文章目录 题目描述输入描述输出描述用例1解题思路Python3源码 题目描述 吃货"和"馋嘴"两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。但是粗心的服务员将披萨切成了每块大小都完全不…...
SSH监控
创建/etc/ssh/sshrc文件 写入以命令 echo " 系统状态 " uptime free -h 每次登录会显示 如果在sshrc文件加入以下脚本每次登录就是执行这个脚本 # cat /etc/ssh/sshrc echo " 系统状态 " uptime free -h /usr/local/bin/monit.sh以…...
leetcode日记(74)扰乱字符串
很有难度的一题,一开始真的绕了很多思维上的弯路。 最开始的想法是递归,看到题目的时候想到动态规划但是完全没有思路应该怎么用,结果确实是递归动态规划。 最开始的想法是构建树,每一层包含这一步划分的方法(实际会…...
RV1126的OSD模块和SDL_TTF结合输出H264文件
目录 一.RV1126多线程处理输出OSD字符叠加图层的流程 1.1. VI模块的初始化 1.2. 初始化VENC模块: 1.3. 初始化RGN模块: 1.4. 绑定VI模块和VENC模块,伪代码如下 1.5. 创建多线程进行OSD字库的叠加: 1.6. 获取每一帧处理过后的…...
GEE:计算长时间序列NPP与NDVI之间的相关系数
GEE中内置了计算相关系数的函数,可以分析两个变量之间的相关性,比如要分析两个波段之间的相关性,主要用到ee.Reducer.pearsonsCorrelation()函数。 ee.Reducer.pearsonsCorrelation() 内容:创建一个双输入归约器,用于…...
水仙花数(华为OD)
题目描述 所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。 例如153是水仙花数,153是一个3位数,并且153 13 53 33。 输入描述 第一行输入一个整数n,表示一个n位的正整数。n在3到7之间&#x…...
【对话状态跟踪】关心整个对话过程用户完整意图变化
对话状态管理器 核心逻辑是解决键冲突和验证范围有效性, 但需依赖外部输入的正确性。在实际应用中, 可能需要结合用户提示或自动修正逻辑以提高鲁棒性。 NLU 槽 值 对儿 NLU的目的是把自然语言解析成结构化语义。结构化语义有多种表示方式,…...
【分享】网间数据摆渡系统,如何打破传输瓶颈,实现安全流转?
在数字化浪潮中,企业对数据安全愈发重视,网络隔离成为保护核心数据的重要手段。内外网隔离、办公网与研发网隔离等措施,虽为数据筑牢了防线,却也给数据传输带来了诸多难题。传统的数据传输方式在安全性、效率、管理等方面暴露出明…...
TikTok创作者市场关闭!全新平台TikTok One将带来哪些改变?
TikTok创作者市场关闭,全新平台TikTok One上线,创作者和品牌将迎来哪些新机遇? 近日,TikTok宣布关闭其原有的创作者市场(TikTok Creator Marketplace),并推出全新平台TikTok One。这一消息在社…...
LeetCode hot 100—矩阵置零
题目 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2࿱…...
部署Windows Server自带“工作文件夹”实现企业网盘功能完整步骤
前文已经讲解过Windows Server自带的“工作文件夹”功能,现以Windows Server 2025为例介绍部署工作文件夹的完整步骤: 为了确保您能够顺利部署和充分利用工作文件夹的功能,我将按照以下步骤进行讲解。 请注意,在域环境中部署工作…...
植物大战僵尸杂交版v3.3最新版本(附下载链接)
B站游戏作者潜艇伟伟迷于12月21日更新了植物大战僵尸杂交版3.3版本!!!,有b站账户的记得要给作者三连关注一下呀! 不多废话下载链接放上: 夸克网盘链接::https://pan.quark.cn/s/6f2a…...
非关系型数据库和关系型数据库的区别
非关系型数据库(NoSQL)和关系型数据库(SQL)的主要区别体现在以下几个方面: 数据模型: 关系型数据库(SQL):数据以表格形式存储,数据行和列组成,每个…...
Peroxidase-conjugated AffiniPure Goat Anti-Human IgG:高酶活,低背景,精准定量人源抗体
在现代生命科学研究中,抗体是实现特定分子识别和信号检测的核心工具。其中,二抗作为连接一抗与检测系统的重要桥梁,其特异性和灵敏度直接影响实验结果的准确性与可靠性。Peroxidase-conjugated AffiniPure Goat Anti-Human IgG, Fcγ Fragmen…...
升级版会议纪要录音转文字工具 识别准转得快 整理省事体验好
前前后后踩过不下10款录音转写工具的坑,要么错字多到要逐行改,要么转出来的内容逻辑混乱,得花好几个小时捋顺,直到用到2026升级版的会议纪要录音转文字工具,才真的感受到什么叫识别准、转得快、整理省事体验好。今早开…...
Llama-3.2-3B优化指南:Ollama性能调优,让模型跑得更快更稳
Llama-3.2-3B优化指南:Ollama性能调优,让模型跑得更快更稳 1. 为什么需要优化Llama-3.2-3B? Llama-3.2-3B作为一款30亿参数的轻量级大语言模型,在消费级硬件上表现出色。但在实际部署中,很多用户会遇到性能瓶颈&…...
幻兽帕鲁存档迁移完全手册:告别数据丢失的终极解决方案
幻兽帕鲁存档迁移完全手册:告别数据丢失的终极解决方案 【免费下载链接】palworld-host-save-fix 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-host-save-fix 你是否曾在更换幻兽帕鲁服务器时,眼睁睁看着自己辛苦培养的角色数据消失无…...
Java协议解析性能瓶颈诊断清单(附JFR火焰图+ByteBuf内存泄漏定位实录)
第一章:Java协议解析性能瓶颈诊断清单(附JFR火焰图ByteBuf内存泄漏定位实录)协议解析层是Netty等高性能网络框架的核心路径,其性能劣化往往表现为CPU尖刺、GC频发或连接延迟陡增。以下为一线实战验证的诊断清单,覆盖JF…...
intv_ai_mk11GPU利用率提升:Llama中型模型批处理与并发请求调优方案
intv_ai_mk11 GPU利用率提升:Llama中型模型批处理与并发请求调优方案 1. 背景与挑战 intv_ai_mk11 是基于 Llama 架构的中等规模文本生成模型,在实际部署中我们发现单请求处理时GPU利用率往往不足30%。这种低效的资源使用导致两个主要问题:…...
8款实用AI论文生成工具(包括爱毕业aibiye)及新手详细指南
在学术研究领域,AI技术的应用显著提升了论文写作的效率与质量。以下推荐8款功能强大的智能工具,涵盖文献解析、内容生成、文本优化等关键环节,助力研究者高效完成从资料收集到论文润色的全流程工作。这些创新解决方案能够有效简化研究过程&am…...
从理论到实践:基于EKF与1RC模型的锂离子电池SOC在线估计与Simulink仿真
1. 锂离子电池SOC估计为什么这么重要? 如果你用过电动车或者手机,肯定遇到过电量显示不准的情况。明明显示还有30%电量,结果突然关机;或者充到80%就再也充不进去了。这些问题的核心,都跟电池的荷电状态(SO…...
打破设备壁垒:Sunshine让游戏自由流动的串流革命
打破设备壁垒:Sunshine让游戏自由流动的串流革命 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想象一下:你在客厅的高性能电脑上开始了一场紧张刺激的3A大…...
医疗AI智能体:从数据到关怀人文设计:告别冰冷精准,构建有温度的诊疗交互.131
一、智能体的人文设计医疗AI智能体以大模型为核心,串联医学知识图谱、实体识别模块、风险评估模块、话术生成模块、伦理审核模块五大核心组件,最终实现精准医学判断 人性化交互的双重目标。而在医疗场景中,用户的核心需求从来不是单纯的数据…...
