c - 减少 C 结构体的 RAM 消耗

标签 c embedded

我目前正在开发微 Controller 的固件。我在代码中使用以下结构:

struct sub
{
uint16_t a1;
uint16_t a2;
uint16_t a3;
uint16_t a4;
uint16_t a5;
uint16_t a6;
uint16_t a7;
uint16_t a8;
uint8_t a9;
uint8_t a10;
};

struct state
{
struct sub sub1;
struct sub sub2;
struct sub sub3;
struct sub sub4;
};


typedef struct
{
uint16_t c1;
uint16_t c2;
uint16_t c3;
uint16_t c4;
struct state state1;
struct state state2;
struct state state3;
struct state state4;
struct state state5;
struct state state6;
struct state state7;
struct state state8;
} status

因此,层次结构是状态、状态和子。 你们中有人认为有可能减少该结构所需的 RAM 大小吗?目前,如果所有变量不存储在结构中,它需要的空间大约是所有变量单独所需空间的两倍。

最佳答案

您可以使用__attribute__((packed))对于您的结构,这将更改填充,然后减少结构所需的 RAM

编辑:

这并不适用于所有编译器,但您必须记住的想法是 padding ,您可以通过按变量的类型对变量进行排序来自然地做到这一点。

例如:

struct s_structure1 {
    int a;
    int b;
    char c;
    char d;
    float e;
}

struct s_structure2 {
    int a;
    char c;
    int b;
    float e;
    char d;
}

s_struct1 的大小(以字节为单位):16

s_struct2 的大小(以字节为单位):20

关于c - 减少 C 结构体的 RAM 消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50946625/

相关文章:

embedded - Cortex M3 从应用程序跳转回引导加载程序,然后再跳转回应用程序

c# - 如何更改c#中窗口窗体的原点即左上角和openGL C即中心?

c - Windows 7 中一些奇怪的 C 编译错误

embedded - 硬件上的高频交易策略编码

linux - 读取NAND闪存并将其写入另一个系统

embedded - 如何处理输入流并根据 UML 状态机图中的输入组合生成输出

c - 为什么此代码在 msdev 上运行时会出现访问冲突?

c - const 限定符和 Const 指针

c++ - 在 C/C++ 中读取和处理 WAV 文件数据

linux - 在处理 init 之前强制加载 Linux 内核