首页 > 代码库 > sizeof字节对齐

sizeof字节对齐

    ()每个成员的起始地址 每个成员的自身对齐值 = 0,如果不等于 则先补空字节直至这个表达式成立;
    ()结构体的总体长度必须为结构体自身对齐值的整数倍,不够就补空字节。

 

#pragma pack(8) 

struct A{ 

    char a; 

    long b; 

};

    对于 struct A 来说,对于char型数据,其自身对齐值为1,对于long类型,其自身对齐值为4, 结构体的自身对齐值取其成员最大的对齐值,即大小4。那么struct A 在内存中的顺序步骤为:

(1) char a, 地址范围为0x0000~0x0000,起始地址为0x0000,满足 0x0000 % 1 = 0,这个成员字节对齐了。

(2) long b, 地址起始位置不能从0x00001开始,因为 0x0001 % 4 != 0,  所以先补空字节,直到0x00003结束,即补3个字节的空字节,从0x00004开始存放b,其地址范围为0x00004~0x0007.

(3)此时成员都存放结束,结构体长度为8,为结构体自身对齐值的2倍,符合条件().

    此时满足条件()和条件()struct A 中各成员在内存中的位置为:a*** b ,sizeof(struct A) = 8(每个星号代表一位,成员各自代表自己所占的位,比如a占一位,b占四位)

 

 

struct B{ 

    char a; 

    struct A b; 

    long c; 

};

    对于struct B,里面有个类型为struct A的成员b自身对齐值为4,对于long类型,其自身对齐值为4. struct B的自身对齐值为4。那么struct B 在内存中的顺序步骤为:

(1) char a, 地址范围为0x0000~0x0000,起始地址为0x0000,满足 0x0000 % 1 = 0,这个成员字节对齐了。

(2) struct A b, 地址起始位置不能从0x00001开始,因为 0x0001 % 4 != 0,  所以先补空字节,直到0x00003结束,即补3个字节的空字节,从0x00004开始存放b,其地址范围为0x00004~0x00011.

(3) long c,地址起始位置从0x000012开始, 因为 0x0012 % 4 = 0,其地址范围为0x00012~0x0015. 

(4)此时成员都存放结束,结构体长度为16,为结构体自身对齐值的4倍,符合条件().

    此时满足条件()和条件()struct B 中各成员在内存中的位置为:a*** b c ,sizeof(struct C) = 24(每个星号代表一位,成员各自代表自己所占的位,比如a占一位,b占八位,c占四位)

 

struct C{ 

    char a; 

    struct A b; 

    double c; 

};

    对于struct C,里面有个类型为struct A的成员b自身对齐值为4,对于double 类型,其自身对齐值为8. struct C的自身对齐值为8。那么struct C 在内存中的顺序步骤为:

(1) char a, 地址范围为0x0000~0x0000,起始地址为0x0000,满足 0x0000 % 1 = 0,这个成员字节对齐了。

(2) struct A b, 地址起始位置不能从0x00001开始,因为 0x0001 % 4 != 0,  所以先补空字节,直到0x00003结束,即补3个字节的空字节,从0x00004开始存放b,其地址范围为0x00004~0x00011.

(3) double c,地址起始位置不能从0x000012开始, 因为 0x0012 % 8 != 0,所以先补空字节,直到0x000015结束,即补4个字节的空字节,从0x00016开始存放c,其地址范围为0x00016~0x0023.

(4)此时成员都存放结束,结构体长度为24,为结构体自身对齐值的3倍,符合条件().

    此时满足条件()和条件()struct C 中各成员在内存中的位置为:a*** b **** c ,sizeof(struct C) = 24(每个星号代表一位,成员各自代表自己所占的位,比如a占一位,b占八位,c占八位)

 

 

struct D{ 

    char a; 

    struct A b; 

    double c; 

    int d; 

};

    对于struct D,自身对齐值为8。前面三个成员与 struct C 是一致的。对于第四成员d,因为 0x0024 % 4 = 0, 所以可以从0x0024开始存放d, 其地址范围为0x00024~0x00027.此时成员都存放结束,结构体长度为2828 不是结构体自身对齐值8的倍数,所以要在后面补四个空格,即在0x0028~0x0031上补四个空格。补完了,结构体长度为32, 为结构体自

 

身对齐值的4被,,符合条件().

    此时满足条件()和条件()struct D 中各成员在内存中的位置为:a*** b **** c d **** ,sizeof(struct D) = 32(每个星号代表一位,成员各自代表自己所占的位,比如a占一位,b占八位,c占八位, d占四位)

 

struct E{ 

    char a; 

    int b; 

    struct A c; 

    double d;     

};

 

typedefstruct node3

{

    int a;

    short b;

    static int c;

}S3;

sizeof(S3)=8.这里结构体中包含静态数据成员,而静态数据成员的存放位置与结构体实例的存储地址无关

 

 

 

 

sizeof字节对齐