【C】结构体的内存占用问题,为什么我的结构体占用的空间那么大啊

请添加图片描述
       结构体在存储的时候,会根据内部数据的数据类型开辟空间,但是按照相邻的数据成员变量的最大对齐方式进行字节对齐,并且影响整个结构体的空间大小

       比如:

struct Demo1 {
    char c;
    short s;
    int i;
};

struct Demo2 {
    int i;
    short s;
    char c;
};

struct Demo3 {
    char c;
    int i;
    short s;
};

       这三个结构体个占用多少个字节?现在用 sizeof() 关键字去验证一下:

在这里插入图片描述
       为什么都是一个char、一个short、一个int,但是所占用空间会不同?那他们在内存中是怎么分布的?
请添加图片描述
       以上是 Demo1、Demo2、Demo3 开辟内存的方式,因为结构体在开辟空间的时候需要遵循变量对其原则,即:

对齐原则1

char 占一个字节,随便存

short 占两个字节,存储的起始地址必须是2的倍数,也就是二进制位最后一位必须是0

int 占四个字节,存储的起始地址必须是4的倍数,也就是二进制位最后两位必须是00

对齐原则2

那么每次开辟空间开辟的都是按照最大的基本数据类型的倍数开

如果结构体内有结构体,则里面的结构体按照同样的类型和该结构体内的基本数据类型比较,开辟空间按照最大的数据类型的倍数开辟

在这里插入图片描述
       比如 Demo4:最大基本数据类型是int,即使下面数组占5个字节,也要给它开辟8个空间,连同int本身共占12个
       Demo5:因为Demo4 最大是int,也就是四个字节,而且比char a要大,所以开辟的空间是4的倍数,12 + 4 = 16

对齐原则3

用 #pragma pack( num ) 自定义最大对齐字节
 
可以填充值位 0 1 2 4 8 ……
       0 表示采用默认字节对齐方式
       设置值大于默认字节对齐方式,则采用默认字节对齐方式;
       每次设置之后,在下一次使用的采用新的字节对齐

系统的默认最大字节对齐方式:
       32位系统中,默认最大以4字节对齐;
       64位系统中,默认最大以8字节对齐

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值