部分字节对齐内容整理(适用于C++中)
字节对齐部分整理(适用于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个字节;然后找到联合体里面基本类型最大的即double占8个字节;因为20不是8的倍数,所以给20补4个字节即可。
三.在联合体里嵌套了一个结构体
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
内容可能并不完整,期待大家一起讨论,后续还会修改。。