谈到union这个关键字,相信大家都不陌生,但是对于他的读写方式,原理可能还揣摩的不够,因为这涉及到一些底层的东西,下面我就来帮忙总结一下。
讲到union,就不得不想到struct,首先必须清楚的是,union声明和union变量定义方式都与结构是相似的,形式如下:
union 联合名
{
数据类型 成员名;
数据类型 成员名;
......
}联合变量名;
例如:
union test
{
int mint;
char mchar;
}m_test;
但是底层存储上,联合体和结构体却有天大的区别:结构体里面所有的成员都占用内存,所以结构体的大小等于其有成员大小之和(还要考虑字节对齐);而联合体里面所有的成员公用同一个内存位置,在不同时间保存不同的数据类型和不同长度的变量,但是该联合体的大小等于其成员变量中长度最大的大小。例如:
union test
{
int minteg;
char mchar;
}mtest;
void main()
{
mtest.minteg = 2;
mtest.mchar = ‘a‘;
cout << mtest.minteg << " " << mtest.mchar
<< " " << sizeof(mtest) << endl;
}
输出的结果为 97 a 4;因为最后赋值的是联合体里面的mchar变量,他将覆盖之前的给minteg所赋值,所以打印出来的minteg就是字符a的ASCII码值,而其大小为int的大小。所以对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。
原文:http://blog.csdn.net/fayery/article/details/24553979