求教大家一个联合体所占字节大小的问题。
union student
{
char name[20];
double al;
char sex;
int age;
float height;
}stu;
声明了一个这样的联合体,如果把第二行double变量注释掉。sizeof(stu)。是20.联合体的大小就是占最大字节的那个大小。。
可是为什么加了double变量之后。sizeof(stu)就变成了24了?是VC6.0运行的。32位机器。。
求高手给出详细的解释。。
[解决办法]
因为字节对齐的原因吧,20不是8(double所占用字节数)的整数倍,24是大于二十的最小的8的整数倍。
[解决办法]
又做了一些试验,证实了VS的对齐原则:
union的对齐原则就是使得对齐尺寸要求最大的数据类型得以满足。
char类型的对齐要求最小,只要1字节。
short的要2字节,int和float4字节,double最大需要8字节。
所以,当union里没有double时,LZ的union只需要满足int和float的要求,用4字节对齐。而添加了double后则更改为8字节对齐。
[解决办法]
sizeof(double) = 8bytes,因此这个联合体按8bytes对齐(按单个数据类型的最大者)。很显然就是24bytes了。这个东西在不同的编译器上可能会有不同的结果,比如用gcc去试试,结果又可能就是20bytes,我手头没有gcc编译器,有的朋友不妨试试。