现代计算机中的内存空间以字节为单位划分,大部分 CPU 都会以 2字节、4字节、8字节......来访问内存。现代 CPU 对齐内存的主要作用是节省内存空间。
C++ 内存对齐规则
对齐规则可以由 #pragma pack(n)
来指定,其中 n
为对齐的字节数。n
可以是 1、2、4、8、16。n
默认的对齐字节数为 8(待考证,不同平台不同编译器不同)。
结构体的对齐单位,是 #pragma pack(n)
的 n
和结构体中最长数据类型的大小这两者中,最小的那个。
样例
CASE A
struct A {
char c1; // 1B
char c2; // 1B
int i1; // 4B
}; // - 8B
CASE B
struct B {
char c1; // 1B
int i1; // 4B
char c2; // 1B
}; // - 12B
CASE C1, C2, C3
struct C1 {
char c1; // 1B
uint64_t n1; // 8B
}; // - 16B
#pragma pack(1) // 全局生效
struct C2 {
char c1; // 1B
uint64_t n1; // 8B
}; // - 9B
struct C3 {
char c1; // 1B
uint64_t n1; // 8B
}; // -9B