Skip to main content

C++ 内存对齐

· 2 min read
therainisme

现代计算机中的内存空间以字节为单位划分,大部分 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