OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8520|回复: 18

MDK中的const

[复制链接]

13

主题

123

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-8-3
在线时间
0 小时
发表于 2014-8-24 01:04:24 | 显示全部楼层 |阅读模式
5金钱
请问声明变量时如果加上const关键字,该变量是否会一直保存在Flash中,通过Dcode总线读取,还是会在运行时加载进内存,通过system总线读取。
个人做出的实验结果如下:
[mw_shl_code=c,true] int main(void) { const u8 a=1; const u8 *pa=&a; u8 b=2; u8 *pb=&b; printf("%x,%x",pa,pb); while(1); }[/mw_shl_code]
结果为2000bf80,2000bf84


这是否意味着const变量在运行时会加载进内存?

最佳答案

查看完整内容[请看2#楼]

可以节省空间,避免不必要的内存分配。 例如:    #define I 3.14159 //常量宏    const double i=3.14159; //此时并未将Pi放入RAM中 ......    double i=Pi; //此时为Pi分配内存,以后不再分配!    double I=PI; //编译期间进行宏替换,分配内存    double j=Pi; //没有内存分配    double J=PI;  ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2013-8-9
在线时间
0 小时
发表于 2014-8-24 01:04:25 | 显示全部楼层
可以节省空间,避免不必要的内存分配。 例如: 
  #define I 3.14159 //常量宏 
  const double i=3.14159; //此时并未将Pi放入RAM中 ...... 
  double i=Pi; //此时为Pi分配内存,以后不再分配! 
  double I=PI; //编译期间进行宏替换,分配内存 
  double j=Pi; //没有内存分配 
  double J=PI; //再进行宏替换,又一次分配内存! 
  const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干份拷贝。
回复

使用道具 举报

13

主题

123

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-8-3
在线时间
0 小时
 楼主| 发表于 2014-8-24 13:10:48 | 显示全部楼层
自己先顶上去
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-8-24 23:16:13 | 显示全部楼层
帮顶....
回复

使用道具 举报

13

主题

123

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-8-3
在线时间
0 小时
 楼主| 发表于 2014-8-24 23:18:42 | 显示全部楼层
再顶,求帮助
回复

使用道具 举报

13

主题

123

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-8-3
在线时间
0 小时
 楼主| 发表于 2014-8-25 14:55:20 | 显示全部楼层
顶顶顶,每日一顶
回复

使用道具 举报

3

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2013-8-9
在线时间
0 小时
发表于 2014-8-25 20:21:30 | 显示全部楼层
const是一个C语言的关键字,它限定一个变量不允许被改变。
回复

使用道具 举报

13

主题

123

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-8-3
在线时间
0 小时
 楼主| 发表于 2014-8-25 20:22:50 | 显示全部楼层
回复【6楼】骑驴闯天下:
---------------------------------
那这个变量在程序运行时是否会加载进RAM呢
回复

使用道具 举报

3

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2013-8-9
在线时间
0 小时
发表于 2014-8-25 20:29:30 | 显示全部楼层
也就是说const的“变量”只会加载一次
回复

使用道具 举报

13

主题

123

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-8-3
在线时间
0 小时
 楼主| 发表于 2014-8-25 20:29:56 | 显示全部楼层
回复【8楼】骑驴闯天下:
---------------------------------
也就是说const定义的常量在运行时依旧会拷贝进内存,而不是从源地址访问。是这样理解吗》
如果用const定义了一个大数组,例如字库,那么这个数组在运行时也会拷贝进内存吗?如果是这样,又如何节省RAM 呢
回复

使用道具 举报

3

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2013-8-9
在线时间
0 小时
发表于 2014-8-25 20:32:10 | 显示全部楼层
你看看宏定义下面的那两句话
回复

使用道具 举报

3

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2013-8-9
在线时间
0 小时
发表于 2014-8-25 20:33:55 | 显示全部楼层
  #define I 3.14159 //常量宏 
  const double i=3.14159; //此时并未将Pi放入RAM中 ...... 
  double i=Pi; //此时为Pi分配内存,以后不再分配! 回复【11楼】骑驴闯天下:
---------------------------------
回复

使用道具 举报

14

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2014-2-19
在线时间
0 小时
发表于 2014-8-26 08:08:26 | 显示全部楼层
回复【8楼】骑驴闯天下:
---------------------------------
高手!!!
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2014-8-26 09:18:27 | 显示全部楼层
对于C语言来说,const修饰的变量仍然当作变量,const唯一的作用是用于语法检查,防止程序意外修改该变量。对于C++来说又有些许微妙的不同,const修饰的变量可以直接当做一个宏,但同时又有语法检查、类型匹配等好处。
业余程序玩家。
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-8-26 09:25:57 | 显示全部楼层
回复【6楼】骑驴闯天下:
---------------------------------
5楼所说的“只读”是关键点,const为类型限定符,表示其值是只读的,与其实质(即定义)并无直接关联。

例:某C文件有外部需访问的变量,为确保访问安全,头文件声明加const。
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2014-8-26 09:26:34 | 显示全部楼层
回复【10楼】SCMartian:
---------------------------------
x86上内存足够,浪费点无所谓。在单片机上,一般编译器都有扩张关键字。比如c51上有idata,code(记不太清是不是这个了,用于将数据保存在rom里面)等关键字扩展。
业余程序玩家。
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-8-26 09:52:29 | 显示全部楼层
回复【16楼】ofourme:
---------------------------------
那MDK的编译器对于<const>修饰的量是如何处理的呢?
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2014-8-26 10:26:16 | 显示全部楼层
回复【17楼】styleno1:
---------------------------------
看我13楼的回复。
业余程序玩家。
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-8-26 13:33:02 | 显示全部楼层
回复【18楼】ofourme:
---------------------------------
我想请教的是MDK的C/C++编译器如何处理<const>修饰的量?
(如生存周期、作用域、存储区域之类的)
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-2 05:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表