【问题标题】:Reduce RAM consumption of structure in C减少 C 中结构的 RAM 消耗
【发布时间】:2018-11-29 11:49:55
【问题描述】:

我目前正在为微控制器开发固件。我在我的代码中使用了以下结构:

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 大小?目前,如果所有变量不存储在结构中,它需要的空间大约是所有变量单独需要的空间的两倍。

【问题讨论】:

  • 这可能取决于您的微控制器的架构(用于字对齐)
  • 看看结构包装和填充,它很有帮助(但它不会创造奇迹)。
  • 在我的机器上,sizeof(status) 是 584。这正是sizeof(sub) (18) * 4 * 8 + 4*2 的结果,所以语句“目前需要如果它们没有存储在结构中,所有变量单独需要的空间大约是所有变量的两倍”是完全不正确的。你机器上status 的实际大小是多少?
  • "所有变量单独需要的空间的两倍":如果这是真的,则表明编译器正在生成 32 位对齐,可能是也可能不是. “打包”结构的选项取决于编译器/目标。在某些目标上,如果不支持非对齐访问,打包结构可能会生成额外的访问代码。节省 RAM 使用量通常是高级应用程序设计问题,而不是代码级“技巧”。例如,每个成员中存储的值范围是多少?他们需要16位吗?例如,您可以使用位域吗?
  • 如果不知道具体使用的系统和编译器,就无法回答有关优化的问题。

标签: c embedded


【解决方案1】:

您可以将__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_structure1 的大小(以字节为单位):16

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

【讨论】:

  • 为什么填充会创建两倍大的结构,这远非显而易见。
  • "这只适用于 gcc 编译器..." __attribute__((packed)) 适用于多个编译器,不仅是 GCC(例如,keil 编译器,keil.com/support/man/docs/armcc/armcc_chr1359124980173.htm)
  • 我认为通过提及打包的想法并参考指定它的 GCC 或 pragma 方法,答案可以很容易地变得更通用。这至少会提供搜索引擎术语来引导某人获得更多信息。
  • 正如您在“编辑”中看到的,我说padding 是要记住的重要思想
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多