之前工作中,很少用到union结构。最近翻看引擎代码,发现有很多结构体的定义中会出现union,就了解了下。
首先,union是个结构
其次,union的所有成员首地址,相对于基址,偏移量都是0
而且,union的内存分配很有意思,能够容纳成员中最宽的那个即可。但这不代表union的大小,就是最大的那个成员。
因为union结构的对齐方式,需要适合所有成员类型。
其实想想,union还是很有用的,既不占用多余内存空间,又能使用不同数据类型。使得业务代码更清晰易读。
最常用的应用场景,嵌入式编程,用于分离高低字节的数据。
int n; //嵌入式环境下,int型占2个字节
//分离高低位
int nHigh = n / 256;
int nLow = n % 256;
/*
对于频繁分离高低位的业务场景而言,上面的操作可以用union优化
*/
union _u{
int n;
char c[2];
}u;
u.n = n;
nHigh = u.c[0];
nLow = u.c[1];