梁越

内存对齐

0 人看过

附实例

规则1

对于结构(或联合)的各个成员,第一个成员位于偏移为0,以后每个数据成员的偏移量必须是#pragma pack指定的数值和结构体(或联合)中最大数据成员长度 这2个数值中较小的一个的倍数。
使用伪代码表示: min(#pragma pack, 结构最大数据成员长度) * N

规则2

在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐也按照#pragma pack指定的数值和结构(或联合)最大数据成员长度这2个数值中较小的一个进行。

规则3

如果没有使用#pragma pack指令来显式的指定内存对齐的字节数,则按照默认字节数来对齐,各个平台的默认对齐规则如下:32位CPU默认按照4字节对齐;64位CPU默认按照8字节对齐。

struct x{
    char a; //4
    int i; //4
    char b; //4
};

int main()
{
    cout << sizeof(x); //12

}
struct x{
    char a; //4
    char b;
    int i; //4
};

int main()
{
    cout << sizeof(x); //8

}

上面两个如果在#pragma pack(8)下也是一样,因为int是4个字节,小于8,所以是4字节对齐

struct x{
    long long a; //8
    char b; //4
    int i; //4
};

int main()
{
    cout << sizeof(x); //

}