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)。
阅读(472) | 评论(0) | 转发(0) |