结构体的对齐机制
一个结构体所占内存的大小并不是结构体内元素所占内存之和。结构体内的元素具有对齐机制。按照对齐单位进行对齐,对齐单位取结构体元素中最大内存。例如:
typedef struct T {
char c; // 1
__int64 d; // 8
int e; // 4
short f; // 2
char g; // 1
shor h; // 2
};
上述结构体中,元素中最大的内存为: 8 8 8 个字节,其对齐方式如下所示:
嵌套结构体的内存
存在如下嵌套结构体:
typedef struct A {
char c; // 1
int d; // 4
short e; // 2
};// 12
typedef struct B {
char c; // 1
__int64 d; // 8
int e; // 4
short f; // 2
A g; // 12
char h; // 1
int i; // 4
};
结构体 A
中的对齐单位为
4
4
4;结构体 B
的对齐单位为
8
8
8;其在内存中的分配结构如下:
结构体内存分配方式与元素顺序有关
存在如下结构体:
struct T1 {
char a; // 1
long b; // 8
char c; // 1
};
struct T2 {
char a; // 1
char b; // 1
long c; // 8
};
其内存分配方式如下:
设置结构体对齐单位
也可以手动设置结构体的对齐单位:使用 #pragma pack(value)
来告诉编译器,使用我们指定的对齐值来取代默认的:
#pragma pack (1) // 指定按 2 字节对齐
#pragram pack () // 取消指定对齐,回复默认对齐