Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59743
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-11 14:33
文章分类

全部博文(31)

文章存档

2014年(31)

我的朋友

分类: C/C++

2014-04-22 20:03:19

struct结构体的大小计算:
struct 大小,与pack的大小(在程序中显示设置#pragma pack(),vc6.0默认大小为8)、结构中最大占用有关
struct A
{
 int a;     0-3
               4-7     要填充(padding)以保证内存对齐的原则
 double b; 8-15
 char c[9]; 16-24
};
首先给a分配内存,因为int占四个字节接着给b分配内存,double占8个字节,所以按照8个字节对齐,起始位为8(8%8=0),b为8-15;
最后char占一个字节,所以c为16-24;
因此结构体A的大小为8+8+9 = 25;有因为25不是结构体中最大占用内存类型double类型大小(8)的整数倍,所以A最后的大小是32;
struct B
{
int a;   
double b;    
double c;   
char d;   
};
同理,按上面的分析方法确定各个变量在内存中的位置:
a,0-3;
  ,4-7;
b,8-15;
c,16-23;
d,24;
TOTAL = 25
25 不是8的倍数,所以最后B大小是32;
总结计算结构体的步骤
1.内存对齐与编译器设置有关,首先要搞清编译器这个默认值是多少
2.如果不想编译器默认的话,可以通过#pragma pack(n)来指定按照n对齐
3.每个结构体变量对齐,如果对齐参数n,变量所占字节数(m),内存地址的起始位置%min(n,m)=0。也就是最小化长度规则
4.结构体总大小: 对齐后的长度必须是成员中最大的对齐参数的整数倍。
5.补充:如果结构体A中还要结构体B,那么B的对齐方式是选它里面最长的成员的对齐方式
所以计算结构体大小要走三步,首先确定是当前程序按照几对齐(参照1,2点),接着计算每个结构体变量的大小和偏移(参照3,5),最后计算结构体总大小(参照4)。
阅读(895) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~