当前位置: 首页 > news >正文

C++中mutable关键字详解

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++;//}

5mutableconst_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 未定义行为

http://www.rkmt.cn/news/180818.html

相关文章:

  • 区块链智能合约测试:确保去中心化可靠性的技术实践
  • 文献综述写作“黑科技”:宏智树AI如何用“学术雷达”扫清研究空白?
  • 【Java毕设源码分享】基于springboot+java社区智慧医疗养老系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 收藏!未来5年程序员最优赛道:AI大模型技术入门指南
  • 2025年口碑好的声学成像仪厂家排名,精选权威声学成像仪管理平台推荐 - 工业品网
  • AI写论文哪个软件最好?实测9款后,只有它敢把“知网链接”直接嵌进参考文献里!
  • 【Java毕设源码分享】基于springboot+java个性化智能学习系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 2025年终酒店加盟品牌推荐:从单房造价到会员体系的全方位投资价值分析 - 十大品牌推荐
  • 国内主流LIMS厂商选型指南
  • 2025年口碑好的移民中介专业公司推荐,实力强的移民中介公司全解析 - 工业品牌热点
  • 2025年湖南儿童心理咨询公司推荐榜:心理咨询医生/心理咨询辅导/学生心理咨询/青少年心理咨询公司精选 - 品牌推荐官
  • Python性能分析工具cProfile:Miniconda-Python3.9镜像内置支持
  • 学长亲荐10个AI论文平台,自考学生轻松搞定毕业论文!
  • 2025年北京ICP许可证办理公司权威推荐榜单:EDI许可证办理/ICP证书代办/电子商务经营许可证/互联网经营许可证/电子商务经营许可证源头公司精选 - 品牌推荐官
  • 收藏!企业级大模型AI应用爆发:程序员必学的落地技能与实战案例
  • 国产 rohs2.0 检测仪品牌推荐哪家强?甄选品质卓越的国产 rohs 检测仪测试仪及 rohs2.0 测试设备标杆品牌泓盛仪器 - 品牌推荐大师1
  • 天虹购物卡回收渠道,回收变现攻略 - 京回收小程序
  • Zookeeper分布式锁如何实现?
  • 计算机毕业设计springboot校园跳蚤市场在线交易系统 基于 SpringBoot 的高校二手物品在线交易平台 校园闲置资源循环交易系统的 SpringBoot 实现
  • P11306 [COTS 2016] 搜索树 Jelka
  • 南极磷虾油哪个牌子正宗 南极磷虾油品牌权威白皮书+临床数据排行榜终极指南 - 博客万
  • PyTorch模型量化部署:Miniconda-Python3.9镜像支持ONNX转换
  • Jupyter Notebook扩展推荐:Miniconda-Python3.9镜像兼容性测试通过
  • 手把手教你玩转开源大模型:从Llama3到企业级应用
  • 清华源https证书过期?Miniconda-Python3.9镜像信任配置指南
  • Jupyter Lab插件安装失败?Miniconda-Python3.9镜像预装常用插件
  • 中医执医考试课程哪家好?三大机构课程深度对比 - 资讯焦点
  • 静态路由
  • 快手图片去水印专业平台:无损去除与批量处理的一站式解决方案
  • 让 AI 分析我 3 年前写的代码,全是漏洞!