怎么能用memcpy复制工会简单的成员?

How could one copy union simple members with memcpy?

本文关键字:简单 成员 memcpy 复制 怎么能      更新时间:2023-10-16

我不太确定关于memcpyunion琐碎成员的标准引号。

考虑代码:

struct Test{
union
{
void(*function_p)(void*);
void(*function_p_c)(const void*);
};
Test(const Test &other)
{
using std::memcpy;
memcpy(&function_p, &other.function_p, sizeof(function_p)); //?
memcpy(&function_p_c, &other.function_p_c, sizeof(function_p_c)); //??
}
};
int main(void)
{
Test t1; t1.function_p = NULL; //let it be NULL for c++98 sake
Test t2(t1); // is it safe? does this set new active member of union?
return 0;
}

所以一个问题引出另一个问题:

  • 上面的代码安全吗? 还是带有第二/第一memcpy的 UB,具体取决于成员用户接触union? 为两个成员打电话memcpy是不是矫枉过正?

  • 如果它不安全,那么我如何在没有一些活动联盟成员标志的情况下实现复制构造函数?

你用两个memcpy做什么是未定义的行为。

该联盟的大小取决于拥有其最大数据成员所需的规模。 其他数据成员以相同的字节分配,作为其中的一部分 最大的成员。该分配的详细信息是 实现定义的,并且从 最近不是写的工会成员。许多编译器 实现作为非标准语言扩展的阅读能力 工会的非活跃成员。

other只有function_p处于活动状态,第二个内存拷贝会触发未定义的行为。

由于两个工会成员在内存中占据相同的空间,因此第二个 memcpy 将覆盖第一个内存。