共同体作用:让几个不同类型的变量共享同一个内存地址。
共用体所占内存大小:共用体所占内存的大小即公用体中长度最大元素所占用的字节数。
方法一:
结构体的内存大小=最后一个成员的偏移量 + 最后一个成员的大小 + 末尾的填充字节数
偏移量:某个成员的实际地址和这个结构体首地址之间的距离。
例.1:
struct data
{
char a;
int b;
double c;
}
比如说这个成员a,由于a是第一个成员,所以它的地址就是结构体的首地
址,它相对于结构体的首地址的偏移就是零。
第二个成员b,b成员距离结构体的首地址隔了一个变量a的大小,所以b的
偏移量为4.那么结构体做字节对齐的时候有这样一个准测:
*每一个成员相对于结构体首地址的偏移量都得是当前成员所占大小的整
数倍,如果不是编译器就会在成员之间加上填充字节。*
b的字节数是4,它的偏移量是1.这个时候,它的偏移量是1,1不是4的整
数倍,所以编译器就是在a成员的后面做一个字节填充,让从b的偏移量变
成4字节,这个时候b的偏移量就是b自身字节大小4的倍数了。
那么,现在再看一下c,对c来说,它的自身大小也是8字节,它目前的偏移量是4(b的偏移量)+4(b的大小)=8,8是c自身大小8的倍数,所以这里编译器不会在成员b和c之间填充字节。
此时c的偏移量 + c的字节大小 = 8 + 8 =16
此时还没有结束,编译器还要去判断,现在的结构体总大小是不是结构体中最宽的基本类型成员大小的整数倍(按整个结构对对齐,整个结构体的对齐值通常是结构体中最大数据类型所占的空间)。
此结构体中的最大数据类型为double,字节大小为8,16是8的倍数,所以c后面无需填充字节,即末尾的填充字节数为零。
//一般来说,结构的对齐准测是:先按数据类型自身进行对齐,然后再按照整个结构体进行对齐。(两个)对齐。
如果一个类型先按自身n字节进行对齐,那么该类型的偏移量得是自身字节数的整数倍。数据自身的对齐值通常就是数据所占的空间大小。整个结构的对齐值一般是结构体中最大数据类型所占的空间大小。