Keil51中const的概念

在软件开发中 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。 也不存在效率不同的问题,至少我没有发现。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ltshan139

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值