嵌入式 C/C++ 开发之压榨程序大小——结构体优化:用好了能省 50% 的空间

嵌入式 C/C++ 开发之压榨程序大小——结构体优化:用好了能省 50% 的空间

CC++ 编程中,结构体(struct)的内存布局对程序的性能和内存使用有着重要的影响,尤其是在嵌入式开发中,RAM 也就那么 16K8K 甚至 4K,寸土寸金,容不得一丝浪费。本文将详细介绍如何通过理解对齐要求、填充、结构体重新排序等技术来优化结构体的内存布局,缩小程序占用空间,从而提高程序的效率和性能。

1. 对齐要求

编译器在内存中布局基本数据类型时受到对齐要求的约束,以加快内存访问速度。这些约束导致了相同的布局,包括 IntelARMRISC-V 等架构。除了 char 类型外,其他基本的 C 语言数据类型都有对齐要求。例如,2 字节的 short 必须从偶数地址开始,4 字节的 intfloat 必须从能被 4 整除的地址开始,8 字节的 longdouble 必须从能被 8 整除的地址开始。这种自我对齐的特性使得内存访问更快。
但是,这也导致了部分内存空间的额外占用——填充。

2. 填充

填充是指编译器在结构体成员之间或结构体末尾添加的额外字节,以满足对齐要求。例如,考虑以下结构体(64 位系统下):

struct foo1 {
   
    
    
    char *p;     /*