是安全的memcpy数据直接到一个联盟而不是它的一个特定成员?

时间:2018-04-18 08:25:04

标签: c++ language-lawyer unions memcpy memory-alignment

说我有这样的工会

union blah {
    foo f;
    bar b;
};

其中foobar都可以轻易复制。这样做是否安全:

blah b;
foo f;
memcpy(&b, &f, sizeof(f));

然后使用b.f作为活动的联盟成员?或者,我是否必须对特定的工会成员进行memcpy,如下所示:

memcpy(&b.f, &f, sizeof(f));

我在实践中关注这个问题的原因是因为我将不得不编写一个大致相同的函数:

template<int c>
void init_union(blah& b, typename type_family<c>::type const& t) {
    switch (c) {
    case 0:
        memcpy(&b.p0, &t, sizeof(t));
        break;
    case 1:
        memcpy(&b.p1, &t, sizeof(t));
        break;
    // etc.
    }
}

但我宁愿能够跳过整个switch语句并写下来:

template<int c>
void init_union(blah& b, typename type_family<c>::type const& t) {
    memcpy(&b, &t, sizeof(t));
}

1 个答案:

答案 0 :(得分:0)

应该是安全的。

memcpy是安全的,只要该类型可以轻易复制,这适用于工会。

只要联盟中只有一名成员活跃,就应该没有问题。