- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)