结构体和共用体大小的计算

1. 共用体和结构体的不同点

结构体类似于一个包裹,结构体中的成员彼此是独立存在的,分布在内存的不同单元中,他们只是被打包成一个整体叫做结构体而已。

共用体中的各个成员其实是一体的,彼此不独立,他们使用同一个内存单元。可以理解为:有时候是这个元素,有时候是那个元素。更准确的说法是同一个内存空间有多种解释方式,共用体union就是对同一块内存中存储的二进制的不同的理解方式。

版权声明:以上为CSDN博主「路溪非溪」的原创文章
原文链接:https://blog.csdn.net/qq_28576837/article/details/125091749

2. 共用体的大小

共用体的大小为内部最宽成员的大小

2.1

union{
char ch1;
int j;
};

大小为int的大小,即4字节

2.2

union{
    long i;
    int k[5];
    char c;
}date;

 大小为int数组的大小,即20字节

2.3

union{
    long i;
    int k[5];
    char c;
    double a;
}date;

大小为int数组的大小,即20字节,但不能整除最大基本类型成员a所占字节数(8)的整数倍,因此大小为24

注:空的共用体大小为1字节 

 3. 结构体的大小

版权声明:以下例子取自CSDN博主「椰子zii」的原创文章
原文链接:https://blog.csdn.net/qq_28576837/article/details/125091749

本文仅对例子进行适当解释,方便自己理解

结构体大小计算有三个原则:
1. 结构体的首地址,必须是结构体 "最宽基本类型成员" 大小的整数倍(0被认为是任何数的整数倍)。
2. 结构体每个成员相对于结构体首地址的偏移量,都是该成员的整数倍
3. 结构体的总大小,为结构体 “最宽基本类型成员” (将嵌套结构体里的基本类型也算上,得出的最宽基本类型) 大小的整数倍

3.1 简单结构体

3.1.1

struct s1{
char ch1;
char ch2;
int i;
};

最宽基本类型成员:int 4字节。结构体大小:8字节。

3.1.2 

struct s1{
char ch1;
int i;
char ch2;
};

最宽基本类型成员:int 4字节。结构体大小:12字节(9不是4的整数倍,因此扩展到12)。

 3.2 成员包含数组的结构体

struct s2{
char ch;
int i;
char str[10];
};

 最宽基本类型成员:int 4字节。结构体大小:20字节(18不是4的整数倍,因此扩展到20)。

3.3 嵌套结构体的结构体 

3.3.1

struct s3{
    char ch;
    int i;
    struct s{
        char ch1;
        int j;
    }sub;
    float f;
};

 最宽基本类型成员:int 4字节。结构体大小:20字节(把里面这个结构体看做是一个char,和一个int,不看做一个整体,但要注意里面结构体的首地址必须是4的整数倍)。

3.3.2 

struct s3{
    char ch;
    char i;
    struct s{
        char ch1;
        int j;
    }sub;
    char f;
};

最宽基本类型成员:int 4字节。结构体大小:16字节(把里面这个结构体看做是一个char,和一个int,不看做一个整体,但要注意里面结构体的首地址必须是4的整数倍;13不是4的整数倍,因此扩展到16)。

3.3.3

struct s3{
    char ch;
    char i;
    struct s{
        char ch1;
        double j;
    }sub;
    char f;
};

最宽基本类型成员:double 8字节。结构体大小:32字节(把里面这个结构体看做是一个char,和一个double,不看做一个整体,但要注意里面结构体的首地址必须是4的整数倍;25不是8的整数倍,因此扩展到32)。

3.4 成员包含联合体的结构体

3.4.1

struct s5{
char ch;
int i;
    union{
    char ch1;
    int j;
    };
};

最宽基本类型成员:int 4字节。结构体大小:12字节(共用体的大小是内部最宽成员的大小,即int 4字节)

3.4.2

typedef union
{
    long i;
    int k[5];
    char c;
}DATE;
struct data
{
    int cat;
    DATE cow;
    double dog;
}too;

union的大小是20字节(内部最宽成员的大小)

最宽基本类型成员:double 8字节。结构体大小:32字节(共用体不要求首地址,所以可以从4开始)

3.5 指定对齐值

指定对齐值:#pragma pack(n) //指定向n对齐
#pragma pack(n) 若以 #pragma pack()作结束,表示该种对齐方式至此为止。 

3.5.1 对齐值小于最大类型成员值

#pragma pack(4)  //指定向4对齐 最大是8
struct s6{
char ch;
int i;
float f;
double d;
};

最宽基本类型成员:double 8字节。对齐值4 < 8,向4对齐。结构体大小:20字节

3.5.2 对齐值大于最大类型成员值 

#pragma pack(10) //指定向10对齐 最大是8
struct s7{
char ch;
int i;
float f;
double d;
};

 最宽基本类型成员:double 8字节。对齐值10 > 8,向8对齐。结构体大小:24字节

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白色彩券

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

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

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

打赏作者

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

抵扣说明:

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

余额充值