结构体对齐
结构对齐的目的是为了加快CPU取数据时的速度,不同的编译器有不同的标准,有关于4字节对齐的,也有关于8字节对齐的,解题时需跟据环境具体分析。
一、判断结构大小,只需要注意3点即可:
判断对齐宽度 j :每个数据成员的对齐按照指定的“对齐系数” n 和这个数据成员自身长度中,比较小的那个进行。
1.小于 j 字节的结构成员,相对起始地址要在成员大小的倍数上
2.整个结构要关于最大的成员大小对齐
3.当结构体成员为数组时,并不是将整个数组当成一个成员来对待,而是将数组的每个元素当一个成员来分配,其他分配规则不变
二、当结构体成员是结构体类型时,那么该过程是个递归过程,且把该成员作为一个整体来对待
(判断对齐宽度 j 时, 结构体内的结构体的对齐宽度 j1 作为数据成员长度中的一个,
如果 j1大于最外层结构体的其他数据成员长度,那么j1 为最外层数据成员的对齐宽度)
三、有位段时的对齐规则是这样:同类型的、相邻的可连续在一个类型的存储空间中存放的位段成员作为一个该类型的成员变量来对待,不是同类型的、相邻的位段成员,分别当作
一个单独的该类型的成员来对待,分配一个完整的类型空间,其长度为该类型的长度,其他成员的分配规则不变,仍然按照前述的对齐规则进行。
struct B
{
int a:5;
int b:7;
int c:6;
int d:9;
char e:2;//当这里为char e:2; sizeof(B)=8 当这里为 char e; sizeof(B)=12 (测试环境 Dev-C++)
int x;
};
struct B
{
int a:8;
int b:8;
int c:8;
int d:7;//当这里为int d:6; sizeof(B)=8 当这里为int d:7; sizeof(B)=12 (测试环境 Dev-C++),把 char 当 int 了?
char e:2;
int x;
};
ps:难道 char 被当做 int 的类型来对待了?