1. 定义
数据结构对齐是指在计算机存储器中排列和访问数据的方式。它由三个独立但相关的问题组成:数据对齐,数据结构填充和打包。
- 数据对齐:当存储地址a是n 个字节的倍数(其中n是2的幂)时,a就被称为n字节对齐。
- 数据结构填充:当数据结构中有不同对齐要求的成员时,为了保持正确的对齐,编译器通常会插入其他未命名的数据成成员。
2. 益处
通常当数据地址是数据大小的倍数时,CPU能最有效地执行对存储器的读写。
3.例子
数据结构成员按顺序存储在内存中。结构的每个成员的类型通常默认对齐,这意味着除非程序员另外请求,否则它将在预定边界上对齐。
在32位x86时,以下典型的对齐适用于Microsoft(Visual C ++),Borland / CodeGear(C ++ Builder),Digital Mars(DMC)和GNU(GCC)的编译器:
- char (one byte) :1-byte aligned.
- short (two bytes) :2-byte aligned.
- int (four bytes):4-byte aligned.
- long (four bytes):4-byte aligned.
- float (four bytes):4-byte aligned.
- double (eight bytes):8-bytealigned on Windows and 4-byte aligned on Linux.
- long long (eightbytes):4-byte aligned.
- Any pointer (four bytes):4-byte aligned(e.g.: char*, int*).
Eg:
struct data {
char c;
float n;
};
该结构体将占用8个字节而非5个字节。
编译后,结构体将填充字节:
struct data {
char c;
char Padding[3];
float n;
};
因float占用4个字节,其存储地址应为4的倍数,因此编译器在前面填充了三个字节。
4. C中的#pragma pack()预处理指令
在结构体中,数据成员对齐模数为min {数据成员所占内存字节数,#pragma pack指定字节数}。