c++ 中const、const_cast

本文详细解析了C++中const、volatile关键字的作用,以及const_cast的用法。重点讲解了const修饰指针的区别,展示了volatile如何影响const_cast后的指针行为。适合理解内存访问控制和类型转换的开发者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 const、const_cast、volatile

  int v1 = 0;
  volatile const int v2 = 0;//必须加volatile,不让后面会出现改变值后,依然cout 出原值的情况。
  int v3 = 8;
  const int* p1 = &v1;//仅*p2为const,p1仍然为非const,仍然可以赋值。见下面赋值
  p1 = &v3;
  const int*  const p5 = &v1;//p5,*p5 均为const.

  //int* p3 = &v2;//error.无法从“const int *”转换为“int *”,因为v2 是const,*p3 是非const
  int* p4 = const_cast<int*>(&v2);//const_cast 转化得到一个新的去掉了const的指针p4,指针仍然指向v2内存。v2本身const不会变。值也不会变。只能通过*p4访问变化后的值。
  *p4 = 6;
  
  std::cout << v2 << std::endl;//v2 前不加volatile的话,debug下v2 是6,cout 出来却是0.

  int* const p6 = &v1;
  //p6 = &v1;//error,“p6”: 不能给常量赋值
  *p6 = v2;//指向的内存仍然可以赋值。

  int p7 = const_cast<int&>(v2);
  p7 = 9;

  int h = v2;

  //std::cout << p7 << " " << v2 << std::endl;
   
  int* p8 = (int*)&v2;

小结:const 放最前面修饰整个表达式的时候(const int* p),说明指针指向的内存为常量,后继不可对此内存继续赋值,但是指针本身内存是可以赋值的。const 放指针前修饰的时候(int* const p),指针本身为常量,指针后续不可赋值。

const_cast<type>(expression) 可以把type转化为不带const的变量。且仍指向原内存。

特别注意,volatile 字段对const_cast 转化后的指针的影响。

### 解决 PP-OCRv4 出现的错误 当遇到 `WARNING: The pretrained params backbone.blocks2.0.dw_conv.lab.scale not in model` 这样的警告时,这通常意味着预训练模型中的某些参数未能匹配到当前配置下的模型结构中[^2]。 对于此问题的一个有效解决方案是采用特定配置文件来适配预训练权重。具体操作方法如下: 通过指定配置文件 `ch_PP-OCRv4_det_student.yml` 并利用已有的最佳精度预训练模型 (`best_accuracy`) 来启动训练过程可以绕过上述不兼容的问题。执行命令如下所示: ```bash python3 tools/train.py -c configs/det/ch_PP-OCRv4/ch_PP-OCRv4_det_student.yml ``` 该方案不仅解决了参数缺失带来的警告,还能够继续基于高质量的预训练成果进行微调,从而提升最终检测效果。 关于蒸馏的概念,在机器学习领域内指的是将大型复杂网络(teacher 模型)的知识迁移到小型简单网络(student 模型)。这里 student 和 teacher 的关系是指两个不同规模或架构的神经网络之间的指导与被指导的关系;其中 teacher 已经经过充分训练并具有良好的性能,而 student 则试图模仿前者的行为模式以达到相似的效果但保持更高效的计算特性。 至于提到的 `Traceback` 错误信息部分,由于未提供具体的跟踪堆栈详情,难以给出针对性建议。不过一般而言,这报错往往涉及代码逻辑错误或是环境配置不当等问题。为了更好地帮助定位和解决问题,推荐记录完整的异常日志,并仔细检查最近修改过的代码片段以及确认依赖库版本的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烈火音视频实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值