版权声明:原创作品,允许转载。转载时请务必以超链接的形式标注原始文章、作者信息和本声明。否则追究法律责任http://blog.csdn.net/wo_hs
之前在学习C语言的时候,对于struct和union的认识就很不清晰,在学习了很多网友的讲解之后,也有了自己的认识。话不多说,下面开讲!
struct叫做结构体,union叫做联合体或者公用体。他们占用内存空间的大小与地址对其有关。对于下面这段代码:
struct S1{
int a;
double b;
char c;
};
union U1{
int a;
double b;
char c;
};
int main(){
cout << "sizeof S1: " << sizeof(struct S1) << endl;
cout << "sizeof U1: " << sizeof(union U1) << endl;
return 0;
}
输出的结果是:
sizeof S1: 24
sizeof U1: 8
我们来分析一下出现这样结果的原因。
int占4字节,double占8字节,char占1字节。4+8+1=13。为什么S1是24字节呢?3*8=24!这是个巧合吗?明显不是。在struct中,所有的成员都会跟占空间最大的成员地址对齐(虽然他们自己的真正占用的内存空间没有改变)。
而union类型是所有成员公用相同的内存空间,所以Union的内存空间与最大成员所占的空间有关,所以U1的大小是8。同时union的空间还与成员中最大的地址对其有关。看下面这个例子:
union U1{
char chs[13];
char a;
};
union U2{
char chs[13];
int b;
};
int main(){
cout << "sizeof U1: " << sizeof(union U1) << endl;
cout << "sizeof U2: " << sizeof(union U2) << endl;
return 0;
}
这个输出的结果是:
sizeof S1: 13
sizeof U1: 16
毫无疑问,char chs[13]是占13个字节的,a占一个字节,小于13,所以U1的大小是13,但是为什么U2时16呢?因为int的大小是4,要跟int地址对齐,结果必然是4的倍数,而16是大于13的最小的4的倍数。
讲到这里大家应该明白了吧?如果有不正确的地方欢迎批评指正!
参考链接:
http://www.cppblog.com/cc/archive/2006/03/20/4382.html
http://www.cnblogs.com/looksgood/archive/2009/10/29/1591949.html