首页 > 解决方案 > 如何使用 memcpy 复制联合简单成员?

问题描述

我不太确定关于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;
}

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

标签: c++language-lawyerstdunionsstandards-compliance

解决方案


您对两个 memcpy 所做的是未定义的行为。

联合体的大小只有容纳其最大数据成员所需的大小。其他数据成员分配在与该最大成员的一部分相同的字节中。该分配的细节是实现定义的,从最近未写入的联合成员中读取是未定义的行为。许多编译器作为非标准语言扩展实现了读取联合的非活动成员的能力。

otherfunction_p具有活动状态,并且第二个 memcopy 触发未定义的行为。


推荐阅读