gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:12:47 25 4
gpt4 key购买 nike

它为什么会存在?在什么情况下它不会导致严格的别名违规,在哪些情况下会导致?

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

我当然是指阅读和写作。

最佳答案

Does reinterpret_cast cause a strict aliasing violation?

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

除非你知道你需要它(很少见),知道没有令人满意的替代品(很少见),并且知道它不会导致未定义的行为,否则使用重新解释转换不是一个好主意。

why does it even exist?

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

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

  • 序列化
  • 将重新解释用作多态形式的 C 接口(interface)。

In what situations does it not cause a strict aliasing violation, and in which ones does it do cause one?

类型转换本身不会造成任何违规。

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

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

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

此列表中缺少:

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

if you cast between two incompatible types, (...), is it safe to use it

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

and the result of that cast is the only pointer that points to the memory it uses in the whole program

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

Is it safe then to cast it back to its original type and also use it assuming the variable where it is stored

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

关于c++ - reinterpret_cast 会导致严格的别名冲突吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62923260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com