c语言struct结构体的字节对齐

struct MyStruct
{
    short a[3];
};

结构体大小为6,每个short是2个字节,3个正好是6

struct MyStruct
{
    char a[3];
};

结构体大小为3,每个char是1个字节,3个正好是3

struct MyStruct
{
    short a;
    int b;
};

结构体大小为8,a占用2个,填充2个,b占4个

struct MyStruct
{
    char a;
    short b;
    int c;
};

结构体大小为8,a占用1个,填充1个,b占用2个,c占用4个

struct MyStruct
{
    char a;
    int b;
    short c;
};

结构体大小为12,a占用1个,填充3个,b占4个,c占2个,填充2个

struct MyStruct
{
    int a;
    short b;
    char c;
};

结构体大小为8,a占4个,b占2个,a占1个,填充1个

struct MyStruct
{
    char a;
    char a1;
    char a2;
    short b;
    int c;
};

结构体大小为12,a a1 a2各占1个,后面填充1个,b占2个,填充2个,c占4个

struct MyStruct {
    int a;
    INT64 b;
    char c;
};
struct MyStruct1 {
    char a[2];
    int b;
    INT64 c;
    short d;
    struct MyStruct e;
};

MyStruct:结构体大小为24,a占用4,填充4,b占用8,c占用1,填充7
MyStruct1:结构体大小为48,a占用2,填充2,b占用4,c占用8,d占用1,填充7,e占用24。第一个变量a,如果是char a[1]到char a[4],结构体大小都不会变化。

struct MyStruct
{
    int a;
    int *b;
};
struct MyStruct1
{
    int a;
    struct MyStruct b;
};

MyStruct:结构体大小是16(64位系统),a占用4,填充4,b是指针,占用8
MyStruct1:结构体大小是24,a占用4,填充4,b占用16

看到上面这些例子,可能有点懵了,不过数据对齐是有规则的:

  1. 结构体中第一个变量起始偏移量是0
  2. 结构体中的其他变量起始偏移量是其类型大小的倍数,换句话说,变量只能从其大小倍数的偏移地址开始存放。比如第一个是char,第二个int(4字节),只能从0,4,8等等存放,所以char后面填充3个字节,int从4的位置放,那么大小就是8。
  3. 结构体嵌套结构体,那么嵌套结构体的起始偏移量要从其内部最大的变量的整数倍数位置开始,不能把结构体看做一个整体。
  4. 结构体的总大小,是其中最大基础变量的倍数(嵌套的结构体不能看做整体)。意思就是如果最后是一个char等小的字节变量,末尾也要填充,把结构体凑成最大变量的倍数大小。

根据这个规则,再看上面的示例,就可以清除的知道结构体的大小和每个位置为什么需要填充。

具体对齐填充的原因,是由于内存cpu等设计导致的,详细内容再做介绍。

posted @ 2022-09-14 10:46  秋来叶黄  阅读(127)  评论(0编辑  收藏  举报