详细解释如何计算一个结构体的大小?

18 篇文章 0 订阅

其他:

1.数组下标可为负:a[-1]  相当于  a+(-1);

2.联合体大小就是成员中最大类型的大小;

如何计算一个结构体的大小?

      例如:

struct Test{

int Num;

char *name;//指针大小取决于编译器的位数  ,64位  为:8字节     32位为:4字节

short date;

char ch;

}*p;

总结计算大小规则:

 1.其大小也与成员顺序有关系,因为前一个成员地址需要与下一个成员地址构成需要满足地址对齐,即当前所占字节数需为当前编译器宽度的整数倍

    如以上结构体(假设编译器为64位):int   num  占4字节,下一成员char * name 占用8字节

                                                                 首先4+8=12>8,即编译器宽度(即指针所占大小:8)存放不下,故第一个成员补全为编译器宽度为8字节,(需保持和下一成员地址对齐,如果当前几个数据成员地址实现对齐,则从下一个成员为起点再重复以上规则))

    接下来:short  date 占用2字节,char ch 占用1字节     2+1=3字节,一个地址宽度能放下,但8+8+3=19不是8的倍数,故需要补齐,其实就是再补5个字节,故此结构体大小为:24字节

注意:如何补?补几个字节,取决于编译器宽度,和其中占用内存大小最大的成员,如过超过编译器宽度,以其数据成员所占内存大小为对齐基准,否则补齐到编译器宽度即可

  • 再举个例子:
struct Test{

//int Num;

//char *name;//指针大小取决于编译器的位数  ,64位  为:8字节     32位为:4字节

short date;

char ch;

}*p;

 以上结构体多大呢?  答案:4字节 (没有达到编译器宽度,以最大成员对齐)

再来个例子:

struct Test{
int Num;

char *name;//指针大小取决于编译器的位数  ,64位  为:8字节     32位为:4字节

short date;

char ch;
int ch1;
//char k;
}TEST;

答案:24  每对其一次,从当前开始对齐,小于编译器宽度以当前 最大元素对齐

   8: 4+补齐4

   8:8(4+8=12 >8,但不是8倍数,故上面元素需补齐4)

   8:2+1+补齐1  + 4

总和:刚好24 不用再补齐

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值