C语言内存优化技术——位域(Bit Fields)

在嵌入式系统和内存受限的项目中,内存优化是一个关键的任务。本文将介绍一种有效的内存优化方法——位域(Bit Fields),并结合代码示例讲解其原理与应用。

什么是位域(Bit Fields)?

位域是一种允许在结构体或类中分配更精确的位数的技术。通过位域,我们可以将多个变量的值存储在同一个字节甚至更小的内存空间中。这样可以减少内存占用,尤其适用于对内存极为敏感的嵌入式系统开发。

位域的语法

位域的语法如下:

struct myStruct {

    类型 成员变量名 : 位数;

};

类型:通常是 int、unsigned int 或 uint8_t 等基本数据类型。

成员变量名:定义的变量名。

位数:该变量占用的位数,必须是正整数。

示例代码

#include <cstdint>
#include <iostream>

class myClass {
public:
    uint8_t u8_1 : 1; // 占用1位
    uint8_t u8_2 : 1; // 占用1位
    uint8_t u8_3 : 1; // 占用1位
};

int main() {
    myClass obj;

    obj.u8_1 = 1;
    obj.u8_2 = 0;
    obj.u8_3 = 1;

    std::cout << "u8_1: " << static_cast<int>(obj.u8_1) << std::endl;
    std::cout << "u8_2: " << static_cast<int>(obj.u8_2) << std::endl;
    std::cout << "u8_3: " << static_cast<int>(obj.u8_3) << std::endl;

    return 0;
}

代码说明:

1. uint8_t 是一个占 8 位的无符号整数类型。

2. u8_1、u8_2 和 u8_3 分别占用了 1 位空间。

3. 总共 3 位的数据可以被存储在一个字节内,减少了空间浪费

内存布局分析

无位域的情况

如果不使用位域,变量会按照其类型的默认大小存储。例如:

uint8_t u8_1, u8_2, u8_3;

使用位域的情况

在使用位域的情况下:

uint8_t u8_1 : 1;
uint8_t u8_2 : 1;
uint8_t u8_3 : 1;

• 每个变量仅占 1 位

• 总共占用 1 字节,节省了大量内存空间。

特殊情况

编译器会使用内存对齐操作,但由于内存对齐的原因,实际sizeof(myClass)应该是1字节

译器会进行4字节对齐,所以即使实际数据只占1字节,也会填充到4字节以满足对齐要求

山和山不相遇,人与人要相逢