14.8.3全局变量
1.边界对齐
对于RISC体系结构的处理器来说,访问边界对齐的数据要比访问非对齐的数据更高效。表14.3显示了ARM结构下各数据类型所占的字节数。
表14.3 各数据类型所占字节数
C数据类型
所占字节数
char,singedchar,unsignedchar
1
short,unsignedshort
2
int,unsignedint,long,unsignedlong
4
float
4
double
4
longlong
4
变量定义虽然很简单,但是也有很多值得注意的地方。先看下面的例子。
定义1:
chara;
shortb;
charc;
intd;
定义2:
chara;
charc;
shortb;
intd;
这里定义的4个变量形式都一样,只是次序不同,却导致了在最终映像中不同的数据布局,如同14.1所示,其中pad为无意义的填充数据。
图14.1变量在数据区里的布局
从图中可以看出,第二种方式节约了更多的存储器空间。
由此可见,在变量声明的时候需要考虑怎样最佳的控制存储器布局。当然,编译器在一定程度上能够优化这类问题,但最好的方法还是在编译的时候把所有相同类型的变量放在一起定义。
2.访问外部变量
首先来看一个例子。下面的例子定义了一些全局变量,在main()中为这些变量赋值并将其打印输出。
/************
*access.c*
************/
#include<stdio.h>
chartx;
charrx;
charbyte;
charc;
unsignedstate;
unsignedflags;
intmain()
{tx=1;
rx=2;
byte=3;
c=4;
state=5;
flags=6;
printf("%u%u%u%u%u%u\n",tx,rx,byte,c,state,flags);
return0;
}
使用armcc编译,生成的代码大小如下。
C$$code132
C$$data12
如果将全局变量声明为extern,变量的定义在其他文件中,那么生成的代码量将有所增加。
将全局变量声明为extern,生成的代码大小如下。
C$$code168
C$$data12
这是因为当将变量声明为extern后,每次访问变量编译器都将从内存重新加载,而不是使用内存偏移,直接访问。