若int 占 2 个字节, char 占 1 个字节, float 占 4 个字节, sizeof(xc) 大小是:
struct stu { union{ char bj[5]; int bh[2]; } _class; char xm[8]; float cj; }xc;
struct stu
{
union{
char bj[5]; // 1*5=5
int bh[2]; // 2*2=4
} class; // union中最大的字节数是5,但需要补齐为 int 的整数倍,所以实际大小为 5 + 1 = 6,但是外面看struct的对齐数,最大的是float的4字节,所以按四字节对齐,这样union补齐成8字节(4的倍数)是8
char xm[8]; // (8) + 8 = 16,16是 float所占字节数 的倍数,不需要对齐
float cj; // (16) + 4 = 20, 是 float 的倍数,不需要补齐,最终大小为 20
}xc
本题涉及两个知识点: 第一、 union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。 第二、 内存对齐规定:结构体struct的总大小为结构体最宽基本类型成员大小的整数倍可见最宽的是float是4.,数组的形式只是多个数据放在一起而已。联合体里面总共是5个字节,要为4的倍数所以为8个字节,
{
union{
char bj[5];
int bh[2];
} class; //所以这个union class只需要可以存储下占用空间最多的成员的空间即可,char bj[5]占用5个字节,所以union class占 //用5个字节
char xm[8]; //8字节
float cj; //4字节
结果是5+(1)+8+(2)+4=20 union的地址为0x22fe9c xm地址为 0x22fea2 cj地址为 0x22feac
typedef struct bb
{
int id; //[0]....[3]
double weight; //[8].....[15] 原则1
float height; //[16]..[19],总长要为8的整数倍,补齐[20]...[23] 原则3
}BB;
typedef struct aa
{
char name[2]; //[0],[1]
int id; //[4]...[7] 原则1
double score; //[8]....[15]
short grade; //[16],[17]
BB b; //[24]......[47] 原则2
}AA;
int main()
{
AA a;
cout<<sizeof(a)<<" "<<sizeof(BB)<<endl;
return 0;
}
结果是
48 24struct stu
{
union{
char bj[5]; // 5
int bh[2]; // 2
} class; // union 总大小为 5,但需要补齐为 int 的整数倍,所以实际大小为 5 + 1 = 6,后一项为 char,不需要对齐
char xm[8]; // (6) + 8 = 14, 不是 float 的倍数,需要对齐,所以最终:(6) + 8 + (2) = 16
float cj; // (16) + 4 = 20, 是 float 的倍数,不需要补齐,最终大小为 20