MSVC ++类转换为结构体

时间:2012-01-31 06:39:45

标签: visual-c++ casting

我目前正在阅读MS Visual C ++ 6.0中的现有代码。我注意到他们将对象转换为结构的代码模式。

有一个CMemory对象。

CMemory a;
MY_STRUCTURE_A* a = (MY_STRUCTURE_A*)(void *)a;
MY_STRUCTURE_B* a = (MY_STRUCTURE_B*)(void *)a;

我检查了自定义内存类,它确实是一个类对象。它确实有一个=运算符定义但我不认为这会允许它被重新解释为一个结构。为什么要这样做呢。如何将对象类型强制转换为不同的对象?

知道为什么要这样做吗?我知道有一个reinterpret_cast,我猜这种转换为无效指向结构指针的技术是类似的。但我不确定它是否相同。这种模式是否可以安全地将类对象转换为结构体?

注意:CMemory只是所用对象的一个​​arbritary名称。它不是MFC类的一部分。

根据Necrolis的评论添加。 CMemory和它只有3个成员按以下顺序声明(1)char指针,(2)int指定(1)的已分配内存,以及(3)指向CMemory其他实例的上一个和下一个指针。它还有很多成员方法。据我所知,即使我直接将一个类投射到一个结构中。该类将从第一个成员变量开始,该变量是char指针。

class CMemory {
public:
    CAMemory();
    ...  Other methods
private:
    char *m_pMemory;
    int m_memorySize;
    ... Other field
}

1 个答案:

答案 0 :(得分:1)

通过类的名称和转换,CMemory很可能是通用内存块标记(对于GC,任意哈希表等),并且为了访问内存,其标记需要强制转换。当然这是一个“最好的猜测”,如果没有看到CMemory的完整代码,则没有任何意义。

这是否安全,完全没有,它不仅仅是UB,而且没有检查(至少在你的例子中)你投射的对象是否是内存布局所代表的对象。此外,由于这是C ++,他们应该避免C强制转换(正如您所指出的那样。双重转换实际上是为了解决编译器错误/警告,这始终是解决它们的最糟糕方式)。