• 结构体字节对齐


    1 结论 与 验证

    1,结构体定义的时候,变量成员的顺序会影响结构体的大小;
    2,对齐:成员变量以什么样的方式,排列;紧密排列、还是松散中间是不是有间隔;
    3,编译器对于对齐方式,可以选择的。vs默认是8字节对齐的。
    4、int类型:4字节,如果编译设置的对齐方式,大于4字节,那么就必须以字节的倍数分配地址,对齐方式>=4字节的时候,如果结构体里面,有int,那么结构体的大小,就是4的整数倍。
    5、如果short、double,同样的道理;
    6、如果有相同类型的变量呢,一定要放在一起,会减小结构体的空间;
    7、结构体定义,变量类型从小到大的顺序比较合适;
    (从小到大==从大到小,都是最节省空间);大小混着放,占用空间很大;
    8、定义结构体,主要是人更容易理解的方式定义。

    size = 8在这里插入图片描述
    size = 12
    在这里插入图片描述
    size = 16
    在这里插入图片描述
    size = 12
    在这里插入图片描述
    size = 16
    在这里插入图片描述
    size = 24
    在这里插入图片描述

    struct s1 {//8
    	char c1;
    	char c2;
    	int a;
    };
    
    struct s2 {//12
    	char c1;
    	int a;
    	char c2;
    };
    
    struct s3{//16
    	char arr[5];
    	int a;
    	short b;
    };
    
    struct s4 {//12
    	char arr[5];
    	short b;
    	int a;
    };
    struct s5 {//16
    	char a;
    	char b;
    	double c;
    };
    
    struct s6 {//24
    	char a;
    	double c;
    	char b;
    };
    struct s7 {//16
    	double a;
    	char c;
    	char b;
    };
    
    struct s8 {//24
    	char a;
    	short b;
    	int c;
    	float d;//4
    	double e;
    };
    
    struct s9 {//32
    	char a;
    	double e;
    	short b;
    	int c;
    	float d;
    	
    };
    struct s10 {//24
    	double e;
    	float d;
    	int c;
    	short b;
    	char a;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    void test1() {
    	cout << sizeof(struct s1) << " " << sizeof(struct s2) << endl;
    	cout << sizeof(struct s3) << " " << sizeof(struct s4) << endl;
    	cout << sizeof(struct s5) << " " << sizeof(struct s6) << " " << sizeof(struct s7) << endl;
    	cout << sizeof(struct s8) << " " << sizeof(struct s9) << " " << sizeof(struct s10)<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (从小到大==从大到小,都是最节省空间);大小混着放,占用空间很大;
    在这里插入图片描述

    2 设置对其字节数

    编译器对于对齐方式,可以选择的。vs默认是8字节对齐的。在这里插入图片描述
    可以程序设置对其字节数
    pragma /pˈræɡ mə/ n.编译指示;杂注

    #pragma pack(1)  //设置字节对齐数为1字节,此时与大小顺序无关,紧密排列
    
    • 1

    在这里插入图片描述

    //4字节对齐
    #pragma pack(4) 
    
    • 1
    • 2

    在这里插入图片描述

    //8字节对齐
    #pragma pack(8) 
    
    • 1
    • 2

    在这里插入图片描述

    3 什么时候修改对齐设置

    在这里插入图片描述
    ·嵌入式环境
    ·VR
    ·特定系统环境
    等这些内存比较小的场合,否则不要随意修改,否则在不同系统运行效果会不一样。

    4 结构体嵌套

    //结构体B嵌套结构体A,结构体A存储起点为A内部最大成员整数倍的地方。
    //(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。)

    //结构体嵌套
    
    //结构体B嵌套结构体A,结构体A存储起点为A内部最大成员整数倍的地方。
    //(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。)
    struct s11 {//8
    	char c1;
    	char c2;
    	int a;
    };
    
    struct s12 {//24
    	char c1;//4
    	s11 d; //从第4开始,d内部最大成员int,d的起点以4的倍数开始,所以前面4字节全部给char c1;
    	int a;
    	double c2;
    };
    
    struct s13 {//24
    	char c1;
    	double c2;
    	int a;
    };
    
    struct s14 {//48
    	char c1;//8
    	s13 d;//从第8开始,d内部最大成员double,d的起点以8的倍数开始,所以前面8字节全部给char c1;
    	int a;
    	double c2;
    };
    
    struct s15 {//8
    	char c1;
    	char c2;
    	int a;
    };
    
    struct s16 {//16
    	char c1;
    	int a;
    	s15 d; //从第8开始
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    void test2() {
    	cout << sizeof(struct s11) << " " << sizeof(struct s12) << endl;
    	cout << sizeof(struct s13) << " " << sizeof(struct s14) << endl;
    	cout << sizeof(struct s15) << " " << sizeof(struct s16) << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

  • 相关阅读:
    将json数据导入到ES集群——解决方案对比&填坑日记
    智能时代的智能工具(gpt)国产化助手
    Spring介绍
    计算机毕业设计springboot驾校学员管理系统w42sj源码+系统+程序+lw文档+部署
    Linux安装JDK最新版
    人脸检测几种模型在RK3399上推理速度对比
    App备案-iOS云管理式证书 Distribution Managed 公钥及证书SHA-1指纹的获取方法
    代码随想录二刷 Day48
    面向对象设计原则之开-闭原则
    【CycleISP: Real Image Restoration via Improved Data Synthesis】ISP论文--1(个人笔记,勿喷)
  • 原文地址:https://blog.csdn.net/m0_51233386/article/details/126732838