Loading

C++字节对齐

/*
 * 字节对齐:默认情况下,某个元素长度为n,它占用的开始地址就要从n的倍数开始 (地址从0x00开始)
 * 需要注意的是:最后总长度需要是最长元素的整数倍,比如t3,最后一个int在0x24到0x27,但由于最长的double是8字节,所以0x28到0x31也被用于对齐
 * char:   1
 * short:  2
 * int:    4
 * double: 8
 *
 * 指定对齐长度时,按对齐长度对齐即可,如 #pragma pack(2) ,所有元素从0,2,4,6,8,10...开始即可
 */


struct t1 { // length: 16
    char a;
    short b;
    int c;
    double d;
};

struct t2 { // 24
    char a;
    short b;
    char e;
    int c;
    // 以上占12字节,0x00 ~ 0x11
    double d;  // double 8字节,从8的倍数开始,即从16开始,0x12 ~ 0x15不用
};

struct t3 { // 32
    char a;     // 0x00 ~ 0x01
    short b;    // 0x02 ~ 0x03
    int c;      // 0x04 ~ 0x07
    double d;   // 0x08 ~ 0x15
    char e[5];  // 0x16 ~ 0x23
    int x;      // 0x 24 ~ 0x27,但长度要为最长元素d的整数倍,所以额外添加0x28~0x31用于对齐
    // int x2;  // 再加一个int,将占用0x28~0x31,长度32不变
};
posted @ 2019-09-22 16:12  dylanchu  阅读(224)  评论(0编辑  收藏  举报