内存对齐的原因:

  • 以空间换时间

对于自定义数据类型对齐规则:

  • 从第一个属性开始 偏移为0
  • 第二个属性开始,地址要放在 该类型整数陪 与 对齐模数比 取小的值 的整数陪上
  • 所有的属性都计算结束后,整体再做二次对齐,整体需要放在属性中做大类型 与 对齐模数比 取小的值的整数倍上

如何查看对齐模数

  • #pragma pack(show)
  • 默认对齐模数 是8,可以将对齐模数改为 2的n次方

当结构体嵌套结构体时候,只需要看结构体中最大数据类型就可以了

代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#pragma pack(show)//可以查看对齐模数
//#pragma pack(1)//默认对齐模数为8 对齐模数可以改为 2的次方
//对于自定义数据类型 内存对齐规则如下
//1.从第一个属性开始 偏移为0
//2.第二个属性开始,地址要放在 该类型整数陪 与 对齐模数比 取小的值 的整数陪上
//3.所有的属性都计算结束后,整体再做二次对齐,整体需要放在属性中做大类型 与 对齐模数比 取小的值的整数倍上
typedef struct _STUDENT
{
   
        int a;//0~3 
        char b;//4~7
        double c;//8~15
        float d;//16~19
}Student;
void test01()
{
   
        printf("size of=%d\n",sizeof(Student));
}
//当结构体嵌套结构体时候,只需要看结构体中最大数据类型就可以了
typedef struct _STUDENT2
{
   
        char a;//0~7
        Student b;     //8~31
        double c;      //32~39
}Student2;
void test02()
{
   
        printf("size of=%d\n", sizeof(Student2));
}
int main()
{
   
        //test01();
        test02();
        return EXIT_SUCCESS;
}