结构体内在对齐

系统 1381 0

本文为本人另一个账号上的文章,那个账号不要了,乾坤大挪移过来 微笑


最近遇到结构体内存对齐的问题,发现自己一知半解,于是在网上搜集了些资料,总结如下。

一、规则

每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”,VC++默认 n = 8。对齐分两步,第一步:数据成员对齐;第二步:结构体对齐。
  • 数据成员对齐: 每个结构体成员所分配的存储位置与起始点的偏移量必须能够整除min(对齐系数,成员字节数)。
  • 结构(或联合)的整体对齐: 整个结构体所占存储空间要能整除min(max(成员字节数),对齐系数)。
综合上面两点规则推断:当所有数据成员长度 都 小于 #pragma pack的n值时,这个n值的大小将不产生任何效果。

二、实例说明

为节省时间,只举例说明“对齐系数”为 2 和 8 时的情形。

(一)对齐系数为2

1、成员数据对齐。
      #pragma pack(2)  
struct test_t   
{  
    int a;   /* 长度4 > 2 按2对齐;起始offset=0 0%2=0;存放位置区间[0,3] */  
    char b;  /* 长度1 < 2 按1对齐;起始offset=4 4%1=0;存放位置区间[4] */  
    short c; /* 长度2 = 2 按2对齐;起始offset=6 6%2=0;存放位置区间[6,7] ,前面空了一个字节*/  
    char d;  /* 长度1 < 2 按1对齐;起始offset=8 8%1=0;存放位置区间[8] */  
};  
#pragma pack()
    

成员总大小= 9
2、整体对齐
整体对齐系数 = min((max(int,short,char), 2) = 2
整体大小(size)=$(成员总大小) 按 $(整体对齐系数) 圆整 = 10 /* 10%2=0 */
为了更好地说明问题,下面调换一下c和d的位置,再看一下对齐情况。
1、成员数据对齐。
      #pragma pack(2)
struct test_t 
{
	int a;  /* 长度4 > 2 按2对齐;起始offset=0 0%2=0;存放位置区间[0,3] */
	char b;  /* 长度1 < 2 按1对齐;起始offset=4 4%1=0;存放位置区间[4] */
	char d;  /* 长度1 < 2 按1对齐;起始offset=8 8%1=0;存放位置区间[5] */
	short c; /* 长度2 = 2 按2对齐;起始offset=6 6%2=0;存放位置区间[6,7] */
};
#pragma pack()
    


成员 总大小 = 8
2、整体对齐
整体对齐系数 = min((max(int,short,char), 2) = 2
整体大小(size)=$(成员总大小) 按 $(整体对齐系数) 圆整 = 8 /* 8%2=0 */

(二) 对齐系数为8

1、成员数据对齐。
      #pragma pack(8)  
struct test_t   
{  
    int a;   /* 长度4 < 8 按4对齐;起始offset=0 0%4=0;存放位置区间[0,3] */  
    char b;  /* 长度1 < 8 按1对齐;起始offset=4 4%1=0;存放位置区间[4] */  
    short c; /* 长度2 < 8 按2对齐;起始offset=6 6%2=0;存放位置区间[6,7] ,前面空一个字节*/  
    char d;  /* 长度1 < 8 按1对齐;起始offset=8 8%1=0;存放位置区间[8] */  
};  
#pragma pack()
    

成员总大小 = 9
2、整体对齐
整体对齐系数 = min((max(int,short,char),8) = 4
整体大小(size)=$(成员总大小) 按 $(整体对齐系数) 圆整 = 12/* 12%4=0 */

结构体内在对齐


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论