You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言最大成员未知的匿名联合体最优拷贝方案如何实现?

C语言匿名联合体结构体拷贝最优方案

方案1:全结构体直接赋值(推荐)

无需修改原有结构体定义,完全符合C标准,编译器自动优化效率最高:

// 原结构体无需任何调整
typedef
    struct {
        union {
            void *p_data;
            size_t s_data;
        };
        int extra_stuff;
    }
    data_and_stuff;

void copy_data(data_and_stuff *from, data_and_stuff *to) 
{
    *to = *from;
}

C标准明确规定结构体的=赋值会完整拷贝整个结构体的所有内存字节,自动覆盖匿名联合体的全部内容,不需要关心void*和size_t的大小差异,也不存在访问未写入联合体成员的未定义行为。

方案2:仅拷贝联合体部分

如果你的场景不需要拷贝extra_stuff成员,仅需要复制联合体内容,用memcpy即可,同样不需要修改原有结构体:

#include <string.h>
#include <stddef.h>

void copy_union_only(data_and_stuff *from, data_and_stuff *to) 
{
    // 拷贝从结构体起始地址到extra_stuff成员之前的所有字节,即完整的匿名联合体内容
    memcpy(to, from, offsetof(data_and_stuff, extra_stuff));
}

该方案同样符合C标准,现代编译器会对小长度的memcpy做内联优化,运行效率和手动赋值成员一致。

原有方案的问题

你提到的新增largest_data成员的方案属于C标准规定的未定义行为:读取联合体中未被写入的成员在部分严格对齐架构、高优化等级编译场景下可能出现非预期结果,不建议使用。

内容的提问来源于stack exchange,提问作者Mark Galeck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:54:04