由于变量排序导致RAM消耗不同

时间:2016-04-27 12:24:33

标签: c embedded

要点: 似乎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;
}

使用DIAB编译器为PowerPC arch编译,使用以下编译器选项,并使用gnu的size实用程序检查两个目标文件中ram-consumption的大小我发现3个字节的差异。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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