紧缩对齐(#pragma pack(n))专题分析课件.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第15道题测试紧缩对齐(packing alignment)概念,其中【1】和【3】12字节;【2】9字节;大多数人都误解了所有的成员都是以#pragma pack (n)字节对齐,其默认对齐也不是两个字节,干建的文章分析的不是很正确,其实对齐的规则是,每个成员按其类型的对齐参数(这个类型的大小)和指定对齐参数(#pragma pack (n))中较小的一个对齐,并且结构的长度必须为结构成员中最长长度的整数倍,不够就补空字节(其中n可以为1, 2, 4, 8,或者16),总体上分两步走就可以计算出结构的长度; 这里有四点很重要: 1.每个成员分别按自己的方式对齐,并能最小化长度 2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度. 3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐 4.不论类型是什么,对齐的边界一定是1,2,4,8,16,32,64..….中一个的整数倍. 下面先从例子和C编译器对结构空间缺省的分配#pragma pack(4) typedef struct { int aa; char a; short b; char c; }CPerf4; #pragma pack(2) typedef struct { char a; short b; char c; }CPerf5; sizeof(CPerf4)结果为12,CPerf5去掉第一个成员变量, sizeof(CPerf5)为6 #pragma pack规定的对齐长度,实际可以使用规则分两步走: [1] 结构,联合,或者C++中类的数据成员,第一个数据成员放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中最小的那个进行。也就是说,当的值等于或超过所有数据成员长度的时候,这个#pragma pack(n)值的大小将不产生任何效果。 [2] 结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值之间最小的那个进行。 具体解释如下: #pragma pack(4) typedef struct {  int aa; /*第一个成员,放在[0,3]偏移的位置*/  char a;/*第二个成员,自身长为1,#pragma pack(4),取小值,也就是1,所以 这个成员按一字节对齐,放在偏移[4]的位置*/  short b;/*第三个成员,自身长2,#pragma pack(4),取2,按2字节对齐,所 以放在偏[6,7]的位置*/  char c; /*第四个,自身长为1,放在[8]的位置*/ }CPerf4; 内存布局示意图(白色框为填充字节) 这个结构实际占据的内存空间是9字节,结构之间的对齐,是按照结构内部最大的成员的长度,和#pragma pack规定的值之中较小的一个对齐的。所以这个例子中,结构之间对齐的长度是min(sizeof(int),4),也就是4; 9按照4字节对齐(4的倍数)的结果是12,填充3个字节所以sizeof(CPerf4)是12。 #pragma pack(2) typedef struct { char a; /*第一个成员,放在[0]偏移的位置*/ short b;/*第二个成员,自身长2,#pragma pack(4),取2,按2字节对齐,所以 放在偏移[2,3]的位置。*/ char c; /*第三个,自身长为1,放在[4]的位置。*/ }CPerf5 内存布局示意图(白色框为填充字节) 整个结构的大小是5字节,按照min(sizeof(short),2)字节对齐,也就是2字节对齐,结果是6,所以sizeof(CPerf5)是6。 对例子[1]中的第一个结构改为按2字节对齐,9按2对齐的结果是10 #pragma pack(2) typedef struct {  int aa; /*第一个成员,放在[0,3]偏移的位置*/  char a;/*第二个成员,自身长为1,#pragma pack(2),取小值,也就是1,所以 这个成员按一字节对齐,放在偏移[4]的位置。*/  short b;/*第三个成员,自身长2,#pragma pack(2),取2,按2字节对齐,所 以放在偏移[6,7]的位置。*/  char c; /*第四个,自身长为1,放在[8]的位置。*/ }; 内存布局示意图(白色框为填充字节) 例子[2]: #pragma pack(8) struct s1 { short a; long b; }; struct s2 { char c; struct s1 d; double e

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档