C++进阶-结构体占用空间大小以及考虑字节对齐

结构体占用空间大小是所有的变量占用空间大小的之和,非也,如果结构体不是一个变量,则考虑字节对齐,如果是一个变量,不涉及到字节对齐

结构体字节对齐规则:

先介绍三个概念:自身对齐值、指定对齐值、有效对齐值。

自身对齐值:数据类型本身的对齐值,例如char类型的自身对齐值是1,short类型是2;

指定对齐值:编译器或程序员指定的对齐值,32位单片机的指定对齐值默认是4;

有效对齐值:自身对齐值和指定对齐值中较小的那个。

对齐两个规则:

1、不但结构体的成员有有效对齐值,结构体本身也有对齐值,这主要是考虑结构体的数组。结构体的有效对齐值是其最大数据成员的自身对齐值,也就是结构体大小是自身对齐值的整数倍;

2、存放成员的起始地址必须是该成员有效对齐值的整数倍。

考虑字节对齐分系统

32系统,最大对齐值是4字节,默认情况下是按照32位4字节对齐的,如下分析:每行4个字节,字符数据按照一个一个的存储;short型数据按照2个字节2个字节的存储;int和folat,以及long,double按照4个字节4个字节存储

64位系统是根据最大变量的长度确定对齐的,如果最长数据为8字节,则8字节对齐,如果最长数据为4字节,则4字节对齐.如下分析:每行8个字节,字符数据按照一个一个的存储;short型数据按照2个字节2个字节的存储;int和float,按照4个字节4个字节的存储,long和double型按照8个字节8个字节的存储

如果是64位,最大对齐位数是结构体中最长的数据类型,不受64位系统长度的限制,比如可以按照long double 16位对齐

64位系统

例子1:

#include <stdio.h>


struct Demo
{
    char  a;
    int   b;
    char  d;
    double c;
};

int main()
{
    printf("%d",sizeof(Demo));
    return 0;
}

结果:

24

例子2:

#include <stdio.h>
#pragma pack (4) 
struct Demo
{
    char  a;
    int   b;
    char  d;
    double c;
};
#pragma pack () 
int main()
{
    printf("%d",sizeof(Demo));
    return 0;
}

结果:

20

参考:

https://blog.csdn.net/Eunice_fan1207/article/details/79696981

https://blog.csdn.net/lyq0527/article/details/52953932

https://www.cnblogs.com/heart-flying/p/9556401.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值