有效使用reinterpret_cast?

时间:2012-04-18 06:31:48

标签: c++

根据经验,以下工作(gcc和VC ++),但它是否是有效且可移植的代码?

typedef struct 
{
    int w[2];
} A;

struct B
{
    int blah[2];
};

void my_func(B b)
{
    using namespace std;
    cout << b.blah[0] << b.blah[1] << endl;
}

int main(int argc, char* argv[])
{

    using namespace std;

    A a;
    a.w[0] = 1;
    a.w[1] = 2;

    cout << a.w[0] << a.w[1] << endl;

    // my_func(a);                     // compiler error, as expected
    my_func(reinterpret_cast<B&>(a));  // reinterpret, magic?
    my_func(  *(B*)(&a) );             // is this equivalent? 

    return 0;
}
// Output:
// 12
// 12
// 12
  • reinterpret_cast有效吗?
  • C风格演员是否相同?
  • 意图是将位于&a的位解释为a B型,这是一种有效/最好的方法吗?

(偏离主题:对于那些想知道为什么我正在尝试这样做的人,我正在处理两个需要128位内存的C库,并使用不同内部的结构名字 - 很像我的例子中的结构。我不想要memcopy,我不想在第三方代码中乱砍。)

1 个答案:

答案 0 :(得分:2)

在C ++ 11中,如果两种类型布局兼容,则完全允许这样做,对于相同且具有标准布局的结构,这是正确的。 See this answer for more details

你也可以在以前版本的C ++中将这两个结构放在同一个联合中,这有一些保证能够以相同的顺序访问相同的数据成员(数据成员的“公共初始序列”)以用于不同的结构类型。

在这种情况下,是的,C风格的演员表是等效的,但reinterpret_cast可能更惯用。