首页 > 解决方案 > reinterpret_cast 会导致严格的别名冲突吗?

问题描述

为什么它甚至存在?在什么情况下它不会导致严格的混叠违规,在哪些情况下会导致?

我的意思是,如果您在两个不兼容的类型之间进行转换,并且该转换的结果是指向它在整个程序中使用的内存的唯一指针,那么在没有其他别名引用该内存的假设下使用它是否安全?那么将其转换回其原始类型并假设存储它的变量是程序上该内存位置的唯一别名,是否安全?这就是我要问的。

我当然是指阅读和写作。

标签: c++types

解决方案


reinterpret_cast 会导致严格的别名冲突吗?

不是单独的,不。但它的滥用可能导致这种违规行为。

使用 reinterpret cast 不是一个好主意,除非你知道你需要它(很少见),知道没有令人满意的替代方案(很少见),并且知道它不会导致未定义的行为。

为什么它甚至存在?

顾名思义,允许重新解释类型。这些用例在 C++ 中很少见,不适合初学者,也不适合中级程序员。

高级程序员可能会遇到它有用的一些情况:

  • 序列化
  • 使用重新解释作为多态形式的 C 接口。

在什么情况下它不会导致严格的混叠违规,在哪些情况下会导致?

演员表本身不会导致任何违规行为。

仅当您强制转换为另一种类型的指针(或引用),然后通过该指针间接访问对象时,才会发生严格的别名违规。因此,如果您不重新解释转换指针(或引用),或者您不访问指向的对象,那么您就没有为对象的类型设置别名,因此不能违反严格的别名规则。

因此,有趣的是使用另一种(别名)类型访问对象是否定义良好。这是来自cppreference的列表:

  • AliasedType 和 DynamicType 是类似的。
  • AliasedType 是 DynamicType 的(可能是 cv 限定的)有符号或无符号变体。
  • AliasedType 是 std::byte (C++17 起)、char 或 unsigned char:这允许将任何对象的对象表示检查为字节数组。

此列表中缺少的是:

  • DynamicType 的指向对象可以与 AliasedType 的另一个对象进行指针互转换。

如果你在两个不兼容的类型之间转换,(...),使用它是否安全

取决于您所说的“使用”是什么意思。如果您的意思是通过重新解释的指针间接并通过“不兼容”类型访问对象,那么这通常是不安全的。

并且该转换的结果是唯一指向它在整个程序中使用的内存的指针

这是无关紧要的。在大多数情况下,编译器几乎不可能证明这是真的。

那么将其转换回其原始类型并假设存储它的变量使用它是否安全

假设转换到另一种类型的格式一开始就很好,那么转换回原始类型总是安全的。


推荐阅读