【问题标题】:Is it safe to reinterpret_cast as a smaller array? Is there a better option?将 reinterpret_cast 重新解释为较小的数组是否安全?有更好的选择吗?
【发布时间】:2021-03-02 07:40:55
【问题描述】:

所以,假设我有一个自定义向量类型:

template <class D, size_t N>
class Vector {
public:
    
    Vector(const D* arrayPtr)
    {
        memcpy(m_array.data(), arrayPtr, sizeof(D)*N);
    }

    ... operators, methods, etc ...

    std::array<D, N> m_array;
};

所以,我实例化了一个新的Vector&lt;double, 4&gt; 指针。但是,有时我想将其视为Vector&lt;double, 3&gt;。执行以下操作是否安全?

Vector4* myVec4 = new Vector4(1, 2, 3, 4);
Vector3* myVec3 = reinterpret_cast<Vector3*>(myVec4);

我会假设“可能”,因为该类在内存中是连续的,并且没有任何虚拟方法。不过,在我采取任何冒险行动之前,我想非常确定。

【问题讨论】:

  • 我认为不会,因为这违反了严格混叠。几周前我问了一个similar question,结论是这不是一个安全的演员。
  • converting constructor 的理想人选。
  • 不,reinterpret_cast 不安全。根据经验,如果有必要通过添加_cast 强制编译器接受转换来使编译器提交,那么使用_cast 的结果是不安全的。 (更正式的描述是您违反了严格的别名规则)。
  • @Peter:我认为这不准确。 static_castdynamic_cast 几乎总是安全的。只有reinterpret_castconst_cast 很危险。
  • @Secundi:我的立场是正确的。我不知道static_cast 完全适用于沮丧。 coliru.stacked-crooked.com/a/a3c5bd033c523d07

标签: c++ pointers vector reinterpret-cast


【解决方案1】:

不,这不安全,因为通过不兼容的指针访问对象会导致未定义的行为。

要实现类似的效果,您可以改用 Vector3View 等间接引用更大向量的类。

【讨论】:

  • 这并不奇怪,我当时正在考虑遵循这样的模式,这只是暂时的付出比它的价值更多。谢谢!
猜你喜欢
  • 2015-02-21
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
相关资源
最近更新 更多