C ++ struct reinterpret_cast

时间:2013-01-03 07:03:31

标签: c++

假设有两个结构A和B.它们有一个共同的结构C. 我想知道将reinterpret_cast调用A或B调用C是否安全。 如果没有,是否有任何方法可以在没有任何性能影响的情况下这样做?

struct C
{
    string m_c1;
    int32_t m_c2;
    double m_c3;
    string m_c4;
};

struct A
{
    C m_a1;
    string m_a2;
    int32_t m_a3;
};

struct B
{
    C m_b1;
    string m_b2;
    int32_t m_b3;
    double m_b4;
};
int main(int argc,char *argv[])
{
        A a;
        a.m_a1.m_c1="A";
        a.m_a1.m_c4="AA";

        B b;
        b.m_b1.m_c1="B";
        b.m_b1.m_c4="BB";

        C* pc = reinterpret_cast<C*>(&a);
        cout << pc->m_c1 << " " << pc->m_c4 << endl;

        pc = reinterpret_cast<C*>(&b);
        cout << pc->m_c1 << " " << pc->m_c4 << endl;

        return 1;
}

2 个答案:

答案 0 :(得分:3)

为什么不从C继承A,B然后再使用static_cast?应该更安全/更清洁。

确实在你的情况下,你根本不需要演员,你应该能够将A或B pt分配给C*

答案 1 :(得分:2)

正如Mike DeSimone所指出的,string课程不能保证是standard-layout课程,因此课程C不是standard-layout,这意味着你有根本不保证内存布局。所以不安全。只有将字符串更改为(const) char*,才能保证其安全。

即便如此,只要类的布局保持不变(你不能改变成员的顺序或改变它们的访问说明符),它只会是安全的,并且类没有任何vtable,这是“安全的” “以这种方式,编译器将生成显示您想要的行为的代码。

这是软件开发人员很少能够提供的两个保证。代码也很难理解。另一个开发人员(或者一个月后的同一个开发人员)可能会忽略这个代码(或者根本就不理解它),并且需要进行所需的更改,然后突然代码被破坏了,并且你手头上有一些难以发现的错误。

AB是可以访问C(或C的某些成员)的类。更具可读性和更安全的解决方案是:

  • AB创建一个访问者,这可能会被内联并且不会导致性能下降。
  • 如果有任何继承的原因,请使用简单继承。 AB 是-a ClassThatHasACAB 是-a { {1}}只要没有虚函数,您就可能在这里看不到任何性能问题。在这两种情况下,访问者都可以为您提供好处,而不需要任何性能成本。

首先创建一些简单易读的代码,然后衡量性能。 Onli如果这个C访问花费你太多,优化。但如果你的优化归结为重新解释演员技巧,请确保周围有很多警告标志,以确保没有人踩到这个诱杀陷阱。