部分字节对齐内容整理(适用于C++中)

来源:互联网 发布:全国流动人口监测数据 编辑:程序博客网 时间:2024/06/05 07:39

字节对齐部分整理(适用于C++中)

一.在单纯的结构体里

1.存在#pragma pack()


#pragma pack(1)表示在字节对齐时设置的对齐模数是按1字节对齐,然而在结构体里字节数最大的为short类型,因此结构体的默认对齐值为2。由于最终的对齐值应选相对而言最小的设置值,因此在此次字节对齐中选择对齐模数1来对齐。所以最终计算出的结构体大小应该为:1+2+1=4

#pragma pack(4)表示在字节对齐时设置的对齐模数是按4字节对齐,然而在结构体里字节数最大的为short类型,因此结构体的默认对齐值为2。由于最终的对齐值应选相对而言最小的设置值,因此在此次字节对齐中选择结构体默认对齐值2来对齐。所以最终计算出的结构体大小应该为:2+2+2=6

2.不存在#pragma pack()

  直接按结构体的默认对齐值来对齐,即按2来,因此计算出的结构体大小为:2+2+2=6

3.没写变量名

 

运行出的结构体大小依然按不存在#pragma pack()的情况来计算,即仍为2+2+2=6

二.在单纯的联合体里

    

运行结果:24

计算联合体大小不用考虑字节对齐,找到联合体里面字节数最大的即 int i[5]占了20个字节;然后找到联合体里面基本类型最大的即double8个字节;因为20不是8的倍数,所以给204个字节即可。

三.在联合体里嵌套了一个结构体

1.结构体没写变量名

 

①存在#pragma pack()

.#pragma pack(1)

  在联合体里面嵌套的结构体如果没有变量,最终计算联合体大小的时候将该结构体的大小视为1,因此sizeof(tagAAAA)=2;

.#pragma pack(4)

  因为对齐模数设的是4,比联合体里的两块变量大小都大,因此,不用管对齐模数,仅找联合体里最大的那个即可。因此sizeof(tagAAAA)=2;

②不存在#pragma pack()

  不存在对齐模数的话,就直接找union里最大的就好

2.结构体写了变量名

 

①存在#pragma pack()

.#pragma pack(1)

   先根据上述纯结构体计算字节大小,求出结构体字节大小为4,经比较得联合体大小为4

.#pragma pack(4)

   同上,先计算出结构体字节大小为6,经比较得联合体大小为6

②不存在#pragma pack()

   直接按计算结构体大小的方法算出大小,在与联合体里其它成员比较,根据联合体的大小计算方法得出联合体union的大小,即为6.

 

***举个栗子:

 

sizeof(union tagAAAA) = 4

sizeof(struct tagBBBB) = 6

sizeof(struct tagCCCC) = 8

 

sizeof(union tagAAAA) = 6

sizeof(struct tagBBBB) = 8

sizeof(struct tagCCCC) = 12

 

内容可能并不完整,期待大家一起讨论,后续还会修改。。