struct 和 union

本文详细解析了联合体(union)与结构体(struct)在内存分配上的特性及计算规则,包括联合体如何减少空间分配总量,以及结构体中成员偏移量与填充字节的计算方法。
1. union的总大小等于它的最大字段的大小:                                                        
union u1
{
     char c;
     int i[2];
     double d;
}
  u1 的大小等于double的大小,即:8。
 
 2. union的应用场景:
  当提前知道一个数据结构中两个不同字段的使用是互斥的,那么将两个字段声明为union的一部分,会减少分配空间的总量。
union node_u
{
    struct 
    {
          union node_u *left;
          union node_u *right;        
    }internal;
    double data[2]; 
}    
     以上联合体的大小为16。
  
  3. struct的计算规则:
          1、每个成员的偏移量都必须是当前成员所占内存大小的整数倍如果不是编译器会在成员之间加上填充字节。 
          2、当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变量大小的整数倍 如果不是会在最后一个成员后做字节填充。
struct unknown
{
  int a;
  char b;
  int c;
  long d;
  char e;
};
printf("%lu\n", sizeof(struct unknown)); //output : 32
对以上代码的分析:
1、遇到第一个成员变量a,该成员偏移量为0,大小为4,符合偏移规则第一条
2、接下来第二个成员变量b,偏移量为4,大小为1,符合偏移规则第一条
3、成员变量c,偏移量为5,大小为4,不符合偏移规则第一条。在成员b和c间填充三个字节,此时,偏移量大小为8,符合偏移规则第一条,继续往下
4、成员变量d,偏移量为12,大小为8,不符合偏移规则第一条,在成员c和d之间填充4个字节,此时偏移量为16,符合偏移规则第一条,继续往下
5、成员变量e,偏移量为24,大小为1,符合偏移规则第一条
6、所有成员大小计算完后,执行偏移规则第二条,最宽的类型是d,long类型,8个字节,当前结构体计算出的大小为25,并不符合第二条规则,于是在末尾填充7个字节,总大小为32个字节,满足第二条偏移规则。到此结构体大小计算结束  
 

转载于:https://www.cnblogs.com/ladawn/p/8439544.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值