共用体和结构体所占内存大小的计算方法一

本文详细解析了共用体的概念及其在内存中如何与其他类型共享地址,并深入探讨了结构体内存对齐原则,包括成员偏移量、填充字节及整体对齐策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

共同体作用:让几个不同类型的变量共享同一个内存地址。

共用体所占内存大小:共用体所占内存的大小即公用体中长度最大元素所占用的字节数。

方法一:

结构体的内存大小=最后一个成员的偏移量 + 最后一个成员的大小 + 末尾的填充字节数

偏移量:某个成员的实际地址和这个结构体首地址之间的距离。

例.1:

struct data
{
    char a;
    int b;
    double c;
}

    比如说这个成员a,由于a是第一个成员,所以它的地址就是结构体的首地

址,它相对于结构体的首地址的偏移就是零。

    第二个成员b,b成员距离结构体的首地址隔了一个变量a的大小,所以b的

偏移量为4.那么结构体做字节对齐的时候有这样一个准测:

       *每一个成员相对于结构体首地址的偏移量都得是当前成员所占大小的整

    数倍,如果不是编译器就会在成员之间加上填充字节。*

     b的字节数是4,它的偏移量是1.这个时候,它的偏移量是1,1不是4的整

数倍,所以编译器就是在a成员的后面做一个字节填充,让从b的偏移量变

成4字节,这个时候b的偏移量就是b自身字节大小4的倍数了。

    那么,现在再看一下c,对c来说,它的自身大小也是8字节,它目前的偏移量是4(b的偏移量)+4(b的大小)=8,8是c自身大小8的倍数,所以这里编译器不会在成员b和c之间填充字节。

    此时c的偏移量 + c的字节大小 = 8 + 8 =16

    此时还没有结束,编译器还要去判断,现在的结构体总大小是不是结构体中最宽的基本类型成员大小的整数倍(按整个结构对对齐,整个结构体的对齐值通常是结构体中最大数据类型所占的空间)。

    此结构体中的最大数据类型为double,字节大小为8,16是8的倍数,所以c后面无需填充字节,即末尾的填充字节数为零。

//一般来说,结构的对齐准测是:先按数据类型自身进行对齐,然后再按照整个结构体进行对齐。(两个)对齐。
如果一个类型先按自身n字节进行对齐,那么该类型的偏移量得是自身字节数的整数倍。数据自身的对齐值通常就是数据所占的空间大小。整个结构的对齐值一般是结构体中最大数据类型所占的空间大小。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值