尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

C++中mutable关键字详解

C++中mutable关键字详解
📅 发布时间:2026/6/19 3:58:24

1mutable是什么?一句话定义

mutable允许在const成员函数中修改某个类成员变量。

mutableintcache_;

它打破的是bitwise const,而不是logical const。


2 C++ 中两种“常量性”

2.1 位级常量性(bitwise const)

voidfoo(constA&a){// 编译器认为:a 的任何比特都不能变}

这是C++ 编译器默认的 const 语义。


2.2 逻辑常量性(logical const)

对象“对外表现不变”,即使内部状态变化

例子:

  • 缓存(cache)
  • 统计次数
  • 延迟计算(lazy evaluation)
  • 调试计数器

mutable正是为“逻辑常量性”设计的


3 最经典例子:缓存(cache)

没有mutable(会直接编译失败)

classSensorModel{public:doublelikelihood()const{if(!cached_){// const 函数不能改成员cache_=compute();cached_=true;}returncache_;}private:boolcached_;doublecache_;};

正确做法:mutable

classSensorModel{public:doublelikelihood()const{if(!cached_){cache_=compute();cached_=true;}returncache_;}private:mutableboolcached_=false;mutabledoublecache_=0.0;};

对外:likelihood() 是 const
对内:允许维护缓存


4mutable的合法修改范围

可以修改

  • mutable成员
  • 指针指向的对象(深层 const)

不可以修改

  • 非 mutable 成员
  • 改变对象的逻辑语义
voidfoo()const{mutable_member++;// OKnormal_member++;//}

5mutable≠const_cast

项目mutableconst_cast
是否安全✅❌
是否标准行为✅⚠️ UB 风险
推荐使用⭐⭐⭐⭐⭐❌

6 SLAM / Eigen 中的真实应用场景


6.1 Eigen 表达式缓存(高频)

classPose{public:constEigen::Matrix4d&T()const{if(!dirty_){returnT_;}T_=computeT();dirty_=false;returnT_;}private:mutablebooldirty_=true;mutableEigen::Matrix4d T_;};

避免每次构造 4×4 矩阵
接口仍然是 const-correct


6.2 SLAM 中的雅可比缓存

classReprojectionFactor{public:constEigen::Matrix<double,2,6>&Jacobian()const{if(!J_cached_){J_=computeJacobian();J_cached_=true;}returnJ_;}private:mutableboolJ_cached_=false;mutableEigen::Matrix<double,2,6>J_;};

大幅减少数值微分/自动微分调用


6.3 统计信息(线程安全另说)

classOptimizer{public:voiditerate()const{++num_calls_;// 合法}private:mutableintnum_calls_=0;};

7mutable在 STL 中的经典用法

std::function/std::bind

autof=[count=0]()mutable{return++count;};

lambda 中的mutable:

  • 允许修改捕获值(by value)

8mutable与线程安全(重要警告 )

mutable不等于线程安全

mutableintcache_;// 多线程下不安全

多线程正确做法:

mutablestd::atomic<int>cache_;

或

mutablestd::mutex mtx_;

9 设计原则

什么时候用mutable

✔ 缓存
✔ 延迟计算
✔ 统计 / debug
✔ 保证 const-correct API


什么时候不能用

❌ 修改业务状态
❌ 改变外部可观测行为
❌ 偷懒绕 const 检查


10 一个“判断是否该用 mutable”的金标准

问自己一句话:

“这个修改会不会改变对象对用户的语义?”

  • 会 → 不该用mutable
  • 不会 → 正确使用场景

11总结

mutable是 C++ 提供的、唯一合法支持“逻辑常量性”的语言级工具

在Eigen / SLAM / 数值优化 / 高性能系统中,
不用mutable:

  • 要么接口不 const-correct
  • 要么性能灾难
  • 要么 const_cast 未定义行为

相关新闻

  • 区块链智能合约测试:确保去中心化可靠性的技术实践
  • 文献综述写作“黑科技”:宏智树AI如何用“学术雷达”扫清研究空白?
  • 【Java毕设源码分享】基于springboot+java社区智慧医疗养老系统的设计与实现(程序+文档+代码讲解+一条龙定制)

最新新闻

  • MQX RTOS任务同步与IPC通信机制深度解析
  • 佛山瓷砖空鼓松动修复:本地口碑不错的 5 家正规靠谱门店推荐 | 卫生间 / 客厅空鼓专修(2026 最新) - 金修达家庭维修
  • i.MX 8QuadMax硬件分区:构建安全隔离的汽车数字座舱双系统
  • WinBtrfs:在Windows平台上原生支持Btrfs文件系统的完整解决方案
  • SPI串行SRAM 23X1024应用指南:硬件设计、驱动开发与实战案例
  • 鹏辉抢滩轻动锂电化浪潮,以高可靠轻动锂电产品助力两轮车、三轮车、电摩动力升级

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号