摘要:似乎 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,但更重要的是缓存)。