在软件开发中 const是一个非常常见的变量修饰type。
但在keil51中,有两件事需要特别注意
第一件事是 用const修饰的变量,keil编译器会把它放在data segment。如果想把变量放在code区,前面必须加code。 附注,有很多编译器是把const变量放在code区的。从keil51手册摘了一段如下,上面说的很清楚了。
第二件事,就是编译完后我们往往从output窗口看到如有所示的信息:. Program Size: data=143.1 xdata=3843 const=906 code=59923。 那这里的const是什么意思?属于data还是code区? 这里,很多人会将这里的const和上面的const混淆。 这里我清晰的解释下。
非常明确地, 这里的const是一个memory class,就好比data/xdata/code都是memory class一样。而且, const和code一样,都放在ROM区,也就是说read only。如下所示,keil手册也说的很明确了。
在keil里面有两个linker: LX51和BL51供选择。 LX51能提供BL51所没有的一些feature,此外还能省code size。很多对code size比较敏感的项目会选用LX51(可以通过Target > Options > Device来选)。这时编译出来的结果会多出来一个memory class,即const!
那有人会接着问,为什么有的项目的const size是0,而有的是非0呢? 这个。。。我没有从keil手册找到现成答案。但是通过实验,我发现有如下规律:
如果你的c 文件里面刚好没有任何const string,如不存在printf("%d", vallue); 这里%d就是const char*了, 那LX51会把这个C文件里用code修饰的变量(如果有的话)放在const memory class。这个时候,如果你简单加一条printf语句如右所示 printf("a"); LX51会把这些code变量重新放到code memory class。 这个完全是LX51的行为,它如果没找到const string,就会把code变量放到const memory class。
总结一下,const memory class只不过是LX51搞得一个飞机,其实和code一样都是放在ROM里面,都是read only。 也不存在效率不同的问题,至少我没有发现。