计算结构体的大小

结构体是用户建立由不同类型数据组成的组合型数据结构。

结构体的大小不是简单地数据类型的相加,而是需要考虑到系统在存储结构体变量时的地址对齐问题。

(1)结构体成员或者加上偏移量必须是下一个成员大小的整数倍

(2)结构体大小必须是最大成员大小的整数倍

struct A
{
    int a; //4
    float b;//4
};//8

int类型占4个字节,刚好是float类型的整数倍,这个结构体就直接相加就可以了。

struct B
{
    char a;//1+3
    int b;//4
};//8

因为char类型只占一个字节,int类型占4个字节,所以要偏移3个字节才是int的倍数,所以总共是8个字节

struct C
{
    char a;//1+1
    short b;//2
    int c;//4
};//8

char类型占一个字节,short占两个字节,偏移量为1,相加为4,int类型占4个字节,4刚好是4的倍数,所以总共是8个字节

struct D
{
    char a;//1+3
    int b;//4
    short c;//2
};//10+2

char占一个字节,偏移3个字节,是int的整数倍,short占两个字节,总共是10字节,但是结构体总大小必须是最长类型大小的整数倍,所以再偏移两个字节,一共为12个字节。

PS:struct C 和 srcuct D 存储的类型都是int,short和char类型,但是一个是8个字节,一个是12个字节,这就需要用户在定义时注意类型的排列问题,注意内存的使用空间。

struct II
{
    int a;///4
    char b;//1+3
};//8

struct I
{
    float x;//4
    struct II y;//8
};//12  

struct II 的大小为8个字节,struct I 的大小为float(4)加上struct II 的大小(8)为12个字节。之所以不是16个字节是因为只需要遵循是最大单个类型的整数倍就可以了。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值