结构体占内存大小计算

来源:互联网 发布:动态桌面壁纸软件 编辑:程序博客网 时间:2024/06/05 16:26
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占四个字节<pack大小(8个字节),所以按照4个字节对齐,起始位值为0,0%4=0,a最后占的内存为0-3; 
接着给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)。
0 0
原创粉丝点击