struct 大小

大小计算是按照下两个原则算出的

1,结构体内成员按自身按自身长度自对齐

自身长度,如char=1,short=2,int=4,double=8,。所谓自对齐,指的是该成员的起始位置的内存地址必须是它自身长度的整数倍。如int只能以0,4,8这类的地址开始。

当成员是有结构体时,(这个结构体成员自身对齐的起始位置为其子成员中最长的长度的整数倍。)

typedef struct dd
{
 char a;
 int b;
 short c;
}DD;


struct ee
{
 char a;
 int b;
 char c;
 int d;
 char f;
 dd e;
}EE;


sizeof(dd) = 1+(3) +4+2 +(2) =12;
sizeof(ee) = 1+(3) +4+1 +(3) +4+1 +(3) +12 = 32;


2.结构体的总大小为结构体的有效对齐值的整数倍

结构体的有效对齐值的确定:

1)当未明确指定时,以结构体中最长的成员的长度为其有效值(如果成员中有结构体时,则该成员不作为最长长度,也即是;结构体不作为有效对齐值)。

2)当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值。

3)当用__attribute__ ((__packed__))指定长度时,强制按照此值为结构体的有效对齐值

typedef struct dd
{
 char a;
 int e;
 short c;
 short d;
 char f;
}DD;

typedef struct ee
{
 char a;
 int b;
 char c;
 int d;
 char f;
 int g;
 char h;//25
 dd e;
}EE;


sizeof(dd) = 16;

sizeof(ee) = 25+(3)+ 16=44;



typedef struct dd
{
 char a;
 short c;
 short d;
}DD;

typedef struct ee
{
 char a;
 int b;
 char c;
 int d;
 char f;
 int g;
 char h;//25
 dd e;//
}EE;


     sizeof(dd) = 6;

     sizeof(ee) = 25+(1) +6=32 //25+(1)刚好是结构体dd中sizeof(short)的整数倍,此值作为成员dd在ee结构体中的自对齐位置,然后加上dd结构体的长度,最后看相加后的此值是否是有效对齐值的整数倍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值