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
相关产品推荐
相关产品推荐

