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

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

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

方法一:

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

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

例.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
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
共用体(Union)和结构体(Struct)是C语言中两种不同的数据类型组织方式。 结构体是一种能够存储不同数据类型的集合,通过定义多个成员变量来表示不同的数据。每个成员变量在内存中据不同的位置,各自独立存储。 共用体则是一种特殊的数据类型,它允许在相同的内存空间中存储不同类型的数据。共用体的所有成员变量共享同一块内存空间,不同成员变量的值互相覆盖。 主要区别如下: 1. 内存用:结构体中的每个成员变量都会据自己的内存空间,成员变量之间不共享内存;而共用体的成员变量共享同一块内存空间,内存大小等于最长的成员变量大小。 2. 成员访问:结构体可以同时访问多个成员变量;而共用体只能访问一个成员变量,因为不同成员变量的值会相互覆盖。 3. 数据关联:结构体中的成员变量是独立的,互相之间没有关联;而共用体的成员变量是共享内存的,修改一个成员变量的值会影响其他成员变量。 4. 数据类型:结构体可以存储不同数据类型的成员变量;而共用体只能存储相同大小的不同数据类型的成员变量。 在使用时,结构体适合表示不同类型的数据集合,而共用体适合处理对同一块内存空间进行多种不同数据类型的操作。需要注意的是,在使用共用体时需要特别小心,确保对于成员变量的访问和赋值是正确的,避免数据混乱和错误的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值