要点: 似乎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
答案 0 :(得分:2)
您的编译器在long
之后填充char
以保持对齐。您可能会找到一种方法来禁用它,但这通常不是一个好主意。相反,您可以有效地打包变量 - 即使在某些情况下,也需要在全尺寸计算机上进行,而不仅仅是嵌入式计算机。例如:
struct thing
{
char c1;
int i1;
char c2;
int i2;
char c3;
int i3;
};
以上是不好的,因为它在填充上浪费了9个字节,当它应该只有16时,总大小为24个字节。如果你创建了很多这样的对象,你就浪费了三分之一的内存(RAM,但更重要的是缓存)。