在没有 #pragma pack宏的情况下
1:数据成员对齐规则:
第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员自身大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(如int在32位机为4字节,则要从4的整数倍地址开始存储。
2:结构体作为成员:
如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)。
3:收尾工作:
结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
- #include <iostream>
- using namespace std;
- typedef struct bb
- {
- int id; //[0]....[3]
- double weight; //[8].....[15]:原则1
- float height; //[16]..[19](sizeof总长要为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()
- {
- cout<<sizeof(AA)<<" "<<sizeof(BB)<<endl;
- return 0;
- }
结果: 48 24
#pragma pack()
在代码前加一句#pragma pack(1)
- #include <iostream>
- using namespace std;
- #pragma pack(1) //新添加代码
- typedef struct bb
- {
- int id; //[0]....[3]
- double weight; //[8].....[15]:原则1
- float height; //[16]..[19](sizeof总长要为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()
- {
- cout<<sizeof(AA)<<" "<<sizeof(BB)<<endl;
- return 0;
- }
上面的代码输出为
32 16
BB是4+8+4=16;AA是2+4+8+2+16=32;
#pragma pack(1)告诉编译器,所有的对齐都按照1的整数倍对齐,换句话说就是没有对齐规则。
#pragma pack(1) ;#pragma pack(2)结果是:32 16
#pragma pack(4)结果是:36 16
#pragma pack(8)结果是:48 24
PS:Vc,Vs等编译器默认是#pragma pack(8),所以测试我们的规则会正常;注意gcc默认是#pragma pack(4),并且gcc只支持1,2,4对齐。套用三原则里计算的对齐值是不能大于#pragma pack指定的n值。
3966

被折叠的 条评论
为什么被折叠?



