嵌入式 C/C++ 开发之压榨程序大小——结构体优化:用好了能省 50% 的空间
在 C
和 C++
编程中,结构体(struct
)的内存布局对程序的性能和内存使用有着重要的影响,尤其是在嵌入式开发中,RAM
也就那么 16K
、8K
甚至 4K
,寸土寸金,容不得一丝浪费。本文将详细介绍如何通过理解对齐要求、填充、结构体重新排序等技术来优化结构体的内存布局,缩小程序占用空间,从而提高程序的效率和性能。
1. 对齐要求
编译器在内存中布局基本数据类型时受到对齐要求的约束,以加快内存访问速度。这些约束导致了相同的布局,包括 Intel
、ARM
和 RISC-V
等架构。除了 char
类型外,其他基本的 C
语言数据类型都有对齐要求。例如,2
字节的 short
必须从偶数地址开始,4
字节的 int
或 float
必须从能被 4
整除的地址开始,8
字节的 long
或 double
必须从能被 8
整除的地址开始。这种自我对齐的特性使得内存访问更快。
但是,这也导致了部分内存空间的额外占用——填充。
2. 填充
填充是指编译器在结构体成员之间或结构体末尾添加的额外字节,以满足对齐要求。例如,考虑以下结构体(64
位系统下):
struct foo1 {
char *p; /*