reinterpret_cast 作为较小的数组是否安全?有更好的选择吗?
Is it safe to reinterpret_cast as a smaller array? Is there a better option?
那么,假设我有一个自定义矢量类型:
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);
我会假设“可能”,因为 class 在内存中是连续的,并且没有任何虚拟方法。但是,在我做出任何冒险的举动之前,我想非常确定。
不,这不安全,因为通过不兼容的指针访问对象会导致未定义的行为。
要实现类似的效果,您可以改用 class,例如间接引用较大向量的 Vector3View
。
那么,假设我有一个自定义矢量类型:
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);
我会假设“可能”,因为 class 在内存中是连续的,并且没有任何虚拟方法。但是,在我做出任何冒险的举动之前,我想非常确定。
不,这不安全,因为通过不兼容的指针访问对象会导致未定义的行为。
要实现类似的效果,您可以改用 class,例如间接引用较大向量的 Vector3View
。