C语言 由于顺序可变而导致的 RAM 消耗不同



摘要:似乎 c 代码的 RAM 消耗取决于变量排序。有没有办法自动优化它?

更长版本:在这里,我粘贴了两个版本的代码,它们仅在变量排序上有所不同。

版本1:

static unsigned long b=1;
static unsigned char a=1;
unsigned long myfunc(){
  return a+b;
}

版本2:

static unsigned char a=1;
static unsigned long b=1;
unsigned long myfunc(){
  return a+b;
}

使用以下编译器选项使用 PowerPC 架构的 DIAB 编译器进行编译,并使用 gnu 的大小实用程序检查两个目标文件中的 ram 消耗大小,我发现相差 3 个字节。

dcc.exe  -Xsmall-data=10 -tPPCE200Z4VFF:simple -c -o version1.o version1.c

第一种情况的 RAM 消耗为 5 字节,而第二种情况的 RAM 消耗为 8 字节。应该是这样的吗?

两种情况下生成的程序集的差异也只是变量的顺序。有没有办法自动优化变量排序以节省 RAM?我想排序应该始终根据变量大小的减小。

参考:戴铂编译器选项:http://www.embedded-tools.de/sites/default/files/pdf/wr_diab_compiler_options_reference_5.9.3-R2.pdf

编译器在char后填充long以保持对齐方式。 您可能会找到一种方法来禁用此功能,但这通常不是一个好主意。 相反,由您来有效地打包变量 - 即使在某些情况下,这也需要在全尺寸计算机上完成,而不仅仅是嵌入。 例如:

struct thing
{
    char c1;
    int i1;
    char c2;
    int i2;
    char c3;
    int i3;
};

以上很糟糕,因为它在填充上浪费了 9 个字节,使总大小达到 24 个字节,而它应该只有 16 个字节。 如果你创建了很多这样的对象,你就浪费了三分之一的内存(RAM,但更重要的是缓存)。

最新更新