一、前言
二、编写优质的代码
1.
2.
3.
4.
5.
6. 内存优化
1. 内存对齐规则
在C语言中,结构体的成员会按照内存对齐原则进行排列,确保每个成员的起始地址是其类型大小的整数倍。32位系统下:
char
:1字节对齐int*
(指针):4字节对齐double
:通常4字节对齐(32位系统可能按4或8对齐,此处假设4)
结构体总大小需为最大成员对齐值的整数倍。
2. product1
的内存布局分析
struct product1 {
char e, w, s, n; // 连续4个char,占4字节
int* address; // 需4字节对齐,起始地址4(无需填充)
double price; // 需4字节对齐,起始地址8(无需填充)
};
总大小计算:
4(char) + 4(int*) + 8(double) = 16字节
无需额外填充,且16是最大对齐值(4)的整数倍。
3. product2
的内存布局分析
struct product2 {
char e, w, s; // 3字节,需填充1字节以满足int*的4对齐
int* address; // 起始地址4,占4字节
double price; // 起始地址8,占8字节
char n; // 1字节,末尾需填充3字节以满足总大小对齐
};
总大小计算:
3(char) + 1(填充) + 4(int*) + 8(double) + 1(char) + 3(填充) = 20字节
由于末尾需要填充到4的倍数,总大小增加到20字节。
4. 关键对比
结构体 | 有效数据 | 填充字节 | 总大小 |
---|---|---|---|
product1 | 16字节 | 0 | 16 |
product2 | 17字节 | 3 | 20 |
- 空间效率:
product1
无填充浪费,而product2
因成员顺序不当导致3字节填充。 - 缓存友好性:紧凑的内存布局(如
product1
)更利于CPU缓存命中,提升性能。