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

高效C/C++之十:Coverity修复问题:尽量多使用 c++强制类型转化

【关注我,后续持续新增专题博文,谢谢!!!】

上一篇我们讲了

        这一篇我们开始讲 高效C/C++之十:Coverity修复问题:尽量多使用 c++强制类型转化

目录

【关注我,后续持续新增专题博文,谢谢!!!】

一、背景

二、:尽量多使用 c++强制类型转化

    2.1:static_cast 静态类型转换(编译时检查)

    2.2 :dynamic_cast 动态类型转换(运行时检查)

    2.3 :const_cast 去只读属性转换(const 转化)

    2.4 :reinterpret_cast 重解析类型转换(强制转化)(慎用)

【关注我,后续持续新增专题博文,谢谢!!!】


一、背景

异常代码

异常代码
Metadata::getMetadata((camera_metadata_t*)metaVirtualAddr, m_vendorTAG, "com.result.data", &data);
正确代码
Metadata::getMetadata(static_cast<camera_metadata_t*>(metaVirtualAddr), m_vendorTAG, "com.result.data", &data);

二、:尽量多使用 c++强制类型转化

    2.1:static_cast 静态类型转换(编译时检查)

可以用隐式转化的地方,都可以用 static_cast, 如果类型不支持 static_cast 会编译检查,会报错,比 c 风格的多了检查的步骤;与以下三个 c++的转化比,速度快一些;可以用于派生类和基类之间指针或引用的转换。

进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;

进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

char a = 'a';
int b = static_cast<char>(a);//正确,将 char 型数据转换成 int 型数据
double *c = new double;
void *d = static_cast<void*>(c);//正确,将 double 指针转换成 void 指针
int e = 10;
const int f = static_cast<const int>(e);//正确,将 int 型数据转换成 const int 型数据
const int g = 20;
int *h = static_cast<int*>(&g);//编译错误,static_cast 不能转换掉 g 的 const 属性类上行和下行转换:
if(Derived *dp = static_cast<Derived *>(bp)){//下行转换是不安全的//使用 dp 指向的 Derived 对象  
}
else{//使用 bp 指向的 Base 对象  
}
if(Base*bp = static_cast<Derived *>(dp)){//上行转换是安全的//使用 bp 指向的 Derived 对象  
}
else{//使用 dp 指向的 Base 对象  
}

   

    2.2 :dynamic_cast 动态类型转换(运行时检查)

dynamic_cast<type*>(e)
dynamic_cast<type&>(e)
dynamic_cast<type&&>(e)

主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行转换时,dynamic_cast 和 static_cast 的效果是一样的;

在进行下行转换时,dynamic_cast 具有类型检查的功能,比 static_cast 更安全。

dynamic_cast 是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。

(1)指针类型
举例,Base 为包含至少一个虚函数的基类,Derived 是 Base 的共有派生类,如果有一个指向 Base 的指针 bp,我们可以在运行时将它转换成指向 Derived 的指针,代码如下:
if(Derived *dp = dynamic_cast<Derived *>(bp)){//使用 dp 指向的 Derived 对象  
}
else{//使用 bp 指向的 Base 对象  
}
值得注意的是,在上述代码中,if 语句中定义了 dp,这样做的好处是可以在一个操作中同时完成类型转换和条件检查两项任务。(2)引用类型
因为不存在所谓空引用,所以引用类型的 dynamic_cast 转换与指针类型不同,在引用转换失败时,会抛出 std::bad_cast 异常,该异常定义在头文件 typeinfo 中。
void f(const Base &b){try{const Derived &d = dynamic_cast<const Base &>(b);  //使用 b 引用的 Derived 对象}catch(std::bad_cast){//处理类型转换失败的情况}
}

    2.3 :const_cast 去只读属性转换(const 转化)

用来修改类型的 const(唯一有此能力的 C++-style 转型操作符)或 volatile 属性。除了 const 或 volatile 修饰之外,new_type 和 expression 的类型是一样的。

1、常量指针被转化成非常量的指针,并且仍然指向原来的对象;

2、常量引用被转换成非常量的引用,并且仍然指向原来的对象;

3、const_cast一般用于修改底指针。如const char *p形式。

const int g = 20;
int *h = const_cast<int*>(&g);//去掉 const 常量 const 属性
const int g = 20;
int &h = const_cast<int &>(g);//去掉 const 引用 const 属性
const char *g = "hello";
char *h = const_cast<char *>(g);//去掉 const 指针 const 属性

    2.4 :reinterpret_cast 重解析类型转换(强制转化)(慎用)

new_type 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。

reinterpret_cast 意图执行低级转型,实际动作(及结果)可能取决于编辑器,这也就表示它不可移植。

【关注我,后续持续新增专题博文,谢谢!!!】

下一篇讲解

http://www.xdnf.cn/news/4920.html

相关文章:

  • 人工智能之数学基础:二次型
  • 内网渗透——红日靶场三
  • HOT 100 | 【子串】76.最小覆盖子串、【普通数组】53.最大子数组和、【普通数组】56.合并区间
  • AI与计算机视觉(CV):目标检测与图像分割的最新进展
  • 行业 |四大痛点待破:“拆解”DeepSeek一体机
  • 英伟达Blackwell架构重构未来:AI算力革命背后的技术逻辑与产业变革
  • 【强化学习】动态规划(Dynamic Programming, DP)算法
  • Jenkins集成Maven
  • 如何构建容器镜像并将其推送到极狐GitLab容器镜像库?
  • 【亲测有效】如何清空但不删除GitHub仓库中的所有文件(main分支)
  • 单例模式的两种设计
  • [论文阅读]Deeply-Supervised Nets
  • Idea Code Templates配置
  • K8S - Harbor 镜像仓库部署与 GitLab CI 集成实战
  • 工业与协议融合篇:如何将多个协议集成进一个系统?
  • OpenCV中适用华为昇腾(Ascend)后端的逐元素操作(Per-element Operations)
  • MCU存储系统架构解析
  • 面试问题(连载。。。。)
  • 【Bootstrap V4系列】学习入门教程之 组件-下拉菜单(Dropdowns)
  • k8s术语之secret
  • 数据库——关系代数之扩展操作
  • Java—— 集合 Collection
  • SNMP 协议介绍、开发方法及示例
  • 0X. Linux嵌入式系统(课堂笔记)
  • 基于STM32、HAL库的FT232RL USB转UART收发器 驱动程序设计
  • 基于主成分分析(PCA)的数据降维
  • 泰勒展开式
  • Ollama调优,提高性能与安全性
  • 15.thinkphp的上传功能
  • 基于redis的定时状态更新