说我有这样的工会
union blah {
foo f;
bar b;
};
其中foo
和bar
都可以轻易复制。这样做是否安全:
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));
}
答案 0 :(得分:0)
应该是安全的。
memcpy
是安全的,只要该类型可以轻易复制,这适用于工会。
只要联盟中只有一名成员活跃,就应该没有问题。