news 2026/5/30 23:22:33

C++中mutable关键字详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 未定义行为

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 15:45:25

收藏必备!大模型推理利器Chain-of-Thought技术详解

随着大语言模型&#xff08;LLM&#xff09;在复杂推理任务中的应用不断拓展&#xff0c;单纯让模型直接输出答案常常达不到我们想要的效果。Chain-of-Thought&#xff08;简称 COT&#xff09;技术通过引导模型一步步“思考”&#xff0c;显著提升了推理准确率和透明度。 带着…

作者头像 李华
网站建设 2026/5/30 5:51:58

【Java毕设源码分享】基于springboot+java个性化智能学习系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/30 23:22:11

python基于GIS的旅游信息管理系统设计与实现_django Flask vue pycharm项目

目录已开发项目效果实现截图关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 ,本人源头供货商 python基于GIS的旅游信息管理系统设计…

作者头像 李华
网站建设 2026/5/28 19:16:43

python基于MySQL的学生选课成绩管理系统t76t7_django Flask vue pycharm项目

目录 已开发项目效果实现截图关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 已开发项目效果实现截图 同行可拿货,招校园代理 ,本人源头供货商 python基于MySQL的学生选课成绩管理…

作者头像 李华
网站建设 2026/5/28 22:45:04

FPKM2TPM

FPKM2TPM <- function(fpkm){exp(log(fpkm) - log(sum(fpkm)) log(1e6)) } fpkm <- read.delim("~/Desktop/fpkm.txt", row.names 1) TPM <- apply(fpkm,2,FPKM2TPM)

作者头像 李华
网站建设 2026/5/28 16:10:10

区块链智能合约测试:确保去中心化可靠性的技术实践

一、智能合约测试的特殊性挑战 不可篡改性的双刃剑 代码部署后无法热修复的特性&#xff0c;要求测试覆盖率达行业最高标准&#xff08;>95%分支覆盖率&#xff09; 案例&#xff1a;2024年Compound协议漏洞因边界条件遗漏导致9000万美元风险 环境依赖复杂性 // 测试需模…

作者头像 李华