结构体大小的计算、联合、位段

一、结构体大小的计算

硬件里的寄存器读取数据的整数倍,有个内存对齐的规则

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

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

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

struct D
{
 char a;//1+3
 int b;//4
 short c;//2+6
 double d;//8
};//24

struct E
{
 char a;//1+1
 short b;//2
 int c;//4
 double d;//8
};//16


E比D排兵布阵好(其实不一定,在一个平台可以这么说)
不同平台内存对齐规则不统一
规则1:将前面的加起来看是否是后面的整数倍(这个说法不准确,应该可以说将前一个加起来看是否是后一个的倍数,凑够最大字节的类型的倍数)


工作中:
struct  F1
{
    char a;
    char x;  //不使用,保留
    short c;
    int b;
    double d;
};


struct F
{
 int a;//4     最大单个整型
 char b;//1
};//5+3,防止定义数组


结果不是5而是sizeof(F)=8    因为5不是4的倍数,所以加3
规则2:看所有字节加起来是不是最大单个类型的倍数

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



struct I
{
 int a;
 struct II
 {
  float b;
  int c;
 }d;//double d
 int *p;
 short e;
};//20


int main()
{
 printf("%d\n",sizeof(struct I));

 struct F sa;
 struct F arr[2];//sizeof(arr) == 10

 return 0;
}

二、位段
       位段的声明和任何普通的结构成员声明相同,但有两个例外。首先,位段成员必须声明为int、signed int或unsigned int类型。其次,在成员名的后面是一个冒号和一个整数,这个整数指定该位段所占用的位的数目。
       位段可以很方便的访问单一值。
三、联合
       联合的所有成员引用的是内存中的相同位置。当你想在不同的时刻把不同的东西存储于同一个位置时,就可以使用联合。
四、结构体遇到段位怎么算大小?
1.struct B
{
    int a:9;
    int b:11;
    int c:12;
}
计算方法:(9+11+12)/8=4   再看4是不是 sizeof(int)的倍数,若不是,则补齐
2.struct B
{
    int a:9;
    int b:11;
}
计算方法:(9+11)/8=3     3不是 sizeof(int)的倍数,那么+1 得4
五、联合体怎么计算大小?
union D
{
    char a;
    int b;
}
计算方法:单个成员占用最大的那个,结果:4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@所谓伊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值