c++ - 将reinterpret_cast 转换为较小的数组是否安全?有更好的选择吗?

标签 c++ pointers vector reinterpret-cast

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

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<double, 4>指针。但是,有时我想将其视为 Vector<double, 3> 。执行以下操作安全吗?

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

我会假设“也许”,因为该类在内存中是连续的,并且没有任何虚拟方法。然而,在做出任何冒险的举动之前,我想非常确定。

最佳答案

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

要实现类似的效果,您可以使用间接引用较大 vector 的类,例如 Vector3View

关于c++ - 将reinterpret_cast 转换为较小的数组是否安全?有更好的选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64903225/

相关文章:

c - C 结构中的自引用

c - C 中的指针比较。它们是有符号的还是无符号的?

c++ - 在字符串 C++ 中转换 Long?

c++ - 用STL C++实现非递增列表

c++ - C++ 中的 UPnP 发现?

c - 这个宏到底在做什么?

c++ - 我怎样才能在 vector 中有一对引用?

python - 当 A 是矩阵时,eig(A) 和 diag(A) 到底返回什么

c++ - 在 C++ 中删除和推回 vector 的元素

c++ - 如何使用获得私有(private)复制构造函数和赋值构造函数的对象?