今天看到有一段程序里在struct里面用了个Union,然后就突然想到了struct和Union的区别, 找了些资料后发现,struct和Union在内存分配的时候有区别,Union里的数据是公用一块内存……,所以给其分配的内存总是Union里面所定义的最大类型长度的整数倍。 而struct里的数据跟Union不一样,它们不共享一块内存,他是按照struct里面定义的数据顺序来进行分配内存的,但是分配的基本单位(即:每分配一次的量)是struct里面所定义的最长的数据类型的长度。 举个形象的例子: struct里面定义的数据类型的顺序为: int a; char b; double c; 那个系统分配给这个struct的内存空间是多少呢? 应该是16! 为什么呢?因为系统先分配8个字节用来放int,结果int只需要4个就够了,然后剩下的4个中的一个可以用来放后面的char,碰到double c时,因为此时的3个字节不能存下,所以再分配了一个8个字节来存放double c
试想下如果struct里面定义的数据类型的顺序为: int a; double b; char c; 那个系统分给这个struct的内存空间又是多少呢? 应该是24! 知道为什么的吧?系统碰到int分给他8个字节存放,碰到double时,剩下的4个字节不足以存放,所以再分配了8个字节,再遇到char c时又分配了8个字节,这样系统其实是浪费了5个字节的空间。 所以在结构体里面最好按照类型从小到大的顺序来…… #include <iostream> using namespace std; struct A1 { char s; double b; }; struct A2 { char s1; double b; char s; }; struct A3 { char s1; char s3; double b; }; union B1 { char a; double b; }; union B2 { char a; char a1; double b; }; union B3 { char a; double b; char a1; }; union B4 { int a[5]; double b; }; int main() { cout<<sizeof(A1)<<endl; cout<<sizeof(A2)<<endl; cout<<sizeof(A3)<<endl; cout<<sizeof(B1)<<endl; cout<<sizeof(B2)<<endl; cout<<sizeof(B3)<<endl; cout<<sizeof(B4)<<endl; return 0; } 运行结果为: 16 24 16 8 8 8 24 |