内存对齐

在没有 #pragma pack宏的情况下 

1:数据成员对齐规则:

第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员自身大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)整数倍开始(如int在32位机为4字节,则要从4的整数倍地址开始存储。 

2:结构体作为成员:

如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)。 

3:收尾工作:

结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

  1. #include <iostream>  
  2. using namespace std;  
  3. typedef struct bb  
  4. {   
  5.     int id;      //[0]....[3]  
  6.     double weight;   //[8].....[15]:原则1  
  7.     float height;    //[16]..[19](sizeof总长要为8的整数倍,补齐[20]...[23]:原则3)  
  8. }BB;  
  9.   
  10. typedef struct aa  
  11. {  
  12.     char name[2];     //[0],[1]  
  13.     int  id;          //[4]...[7]:原则1  
  14.     double score;     //[8]....[15]      
  15.     short grade;      //[16]...[17]          
  16.     BB b;             //[24]...[47]:原则2  
  17. }AA;  
  18.   
  19. int main()  
  20. {  
  21.   cout<<sizeof(AA)<<" "<<sizeof(BB)<<endl;  
  22.   return 0;  
  23. }   

结果: 48  24 

#pragma pack()

在代码前加一句#pragma pack(1)

 

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. #pragma pack(1)      //新添加代码  
  5. typedef struct bb  
  6. {  
  7.     int id;          //[0]....[3]  
  8.     double weight;   //[8].....[15]:原则1  
  9.     float height;    //[16]..[19](sizeof总长要为8的整数倍,补齐[20]...[23]:原则3)  
  10. }BB;  
  11.   
  12. typedef struct aa  
  13. {  
  14.     char name[2];     //[0],[1]  
  15.     int  id;          //[4]...[7]:原则1  
  16.     double score;     //[8]....[15]      
  17.     short grade;      //[16]...[17]          
  18.     BB b;             //[24]...[47]:原则2  
  19. }AA;  
  20.   
  21. int main()  
  22. {  
  23.     
  24.   cout<<sizeof(AA)<<" "<<sizeof(BB)<<endl;  
  25.   return 0;  
  26. }  


 

上面的代码输出为

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值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值