A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 转街过巷 中级黑马   /  2015-4-29 13:46  /  1147 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


就一个朋友提出朋友提出的结构体长度计算整理的帖子。
1.
struct men
{
  int name;
  double hight;
};//在内存对齐里  上面是有16字节?
//如果再加4个char类型,会是几个字节???
2.
//例如:
struct men
{
  int name;
  double hight;
char *a;
char *b;
char *c;
char *d;
};//像这种有几个字节的内存???

结构体大小的计算方法和步骤
1)将结构体内所有数据成员的长度值相加,记为sum_a;
2)将各数据成员为了内存对齐,按各自对齐模数而填充的字节数累加到和sum_a上,记为sum_b。对齐模数是#pragma pack指定的数值以及该数据成员自身长度中数值较小者。该数据相对起始位置应该是对齐模式的整数倍;
3)将和sum_b向结构体模数对齐,该模数是【#pragma pack指定的数值】、【未指定#pragma pack时,系统默认的对齐模数(32位系统为4字节,64位为8字节)】和【结构体内部最大的基本数据类型成员】长度中数值较小者。结构体的长度应该是该模数的整数倍。

本题解题步骤:
1.
步骤1:所有数据成员自身长度和: 4B+8B= 12B --> sum_a = 12B
步骤2:数据成员name放在相对偏移0处,之前不需要填充字节;数据成员hight为了内存对齐,根据“结构体大小的计算方法和步骤”中第二条原则,其对齐模数是8,之前需填充4个字节,sum_a + 4 = 16B --> sum_b = 16B
步骤3:按照定义,结构体对齐模数是结构体内部最大数据成员长度和pragma pack中较小者,前者为8后者为4,所以结构体对齐模数是4。sum_b应该是4的整数倍,16是4的整数倍不需要填充。
所以只有第一个填充到8B。
结果为8B+8B=16B.

2.
步骤1:所有数据成员自身长度和:4B + 8B + 4B+ 4B+ 4B+ 4B = 24B --> sum_a = 24B
步骤2:数据成员name放在相对偏移0处,之前不需要填充字节;数据成员height为了内存对齐,根据“结构体大小的计算方法和步骤”中第二条原则,其对齐模数是8,之前需填充4个字节,sum_a + 4 = 28B --> sum_b = 28B
步骤3:按照定义,结构体对齐模数是结构体内部最大数据成员长度和pragma pack中较小者,前者为8后者为4,所以结构体对齐模数是4。sum_b应该是4的整数倍,28是4的整数倍不需要填充。同理,后面的3个数据成员也不用填充。
所以只有第一个填充到8B。
结果为8B+8B+4B+4B+4B+4B=32B

2 个回复

倒序浏览
第一个16Byte, 第二个48Byte
回复 使用道具 举报
我用vc6.0试过是32.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马