数据结构——字节对齐

字节对齐的含义与目的

什么是字节对齐:变量存储的起始位置是最终字节对齐值的整数倍;

字节对齐的目的:为了提高内存存取效率;

变量字节对齐值得原则

1、变量的自身字节对齐值

char   :1byte
short  :2byte
int    :4byte
long   :4byte
double :4byte

2、编译器默认对齐基数:

32位:4字节
64位:8字节

3、最终字节对齐值

前述变量的自身字节对齐值和编译器要求的对齐基数中较小者

4、结构体每个成员相对于结构体首地址的偏移量 (offset) 都是该成员大小与对齐基数中的较小者的整数倍,如有需要编译器会在成员之间加上填充字节 (internal padding)

5、结构体的总大小为结构体最宽基本类型成员大小对齐基数中的较小者的整数倍

6、可通过#pragma pack(n)修改对齐基数

字节对齐举例

struct A
{
    short var; // 起始偏移:0
    int var1;  // 起始偏移:4
    long var2; // 起始偏移:8
    char var3; // 起始偏移:13
};
sizeof(A) : 16
struct B
{
     int a;   //1-4字节
     char b;  //5字节
     short c; //7-8字节
};
sizeof(B) : 8
struct C
{
     char b;  //1字节
     int a;   //4-8字节
     short c; //9-10字节
     //
};
sizeof(C) : 12

改变编译器默认对齐基数

#pragma pack (2) /*指定按2字节对齐*/
struct D
{
     char b;  //1字节
     int a;   //2-6字节
     short c; //7-8字节
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
sizeof(D) : 8
#pragma pack (1) /*指定按1字节对齐*/
struct E
{
     char b;  //1字节
     int a;   //2-5字节
     short c; //6-7字节
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
sizeof(E) : 7

参考文章:字节对齐 详解

发表评论

您的电子邮箱地址不会被公开。