WINCE+ARM的系统,把全局不变的数组加一个const修饰符能起到什么作用?减少内存的占用?提高程序执行速度?ARM下ROM可以当RAM使用吗?

xqhrs232 2009-02-03 04:51:25
WINCE+ARM的系统,把全局不变的数组加一个const修饰符能起到什么作用?减少内存的占用?提高程序执行速度?ARM下ROM可以当RAM使用吗?
...全文
560 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
xqhrs232 2009-02-06
  • 打赏
  • 举报
回复
const 比#DEFINE有优势谁都知道,因为effective in c++里面说的很清楚了。我想知道的是,对于全局的大数组加CONST修饰的作用与优势!讨论不是STACK/HEAP里面的临时个别变量(不是立即数)。
xqhrs232 2009-02-05
  • 打赏
  • 举报
回复
大家还不明白我的问题,我问的是这样做的作用是什么?可以节省内存?节省STACK空间?可以让程序跑的更快?加CONST在形成的二进制文件里面处在那个节里面(。CODE/TEXT),不加CONST又会是在那个节里面。处在不同的节有什么区别?
儿大不由爷 2009-02-05
  • 打赏
  • 举报
回复
const 修饰的可以作为全局的,哈哈
navi_dx 2009-02-05
  • 打赏
  • 举报
回复
当立即数const和#define有什么区别?
const int var[1000]={0}; 也能当立即数
儿大不由爷 2009-02-05
  • 打赏
  • 举报
回复
const 修饰的标识符,默认是static作用域的,如果要全局使用,在其定义的时候要添加extern 修饰,其他文件也用extern修饰去声明。
儿大不由爷 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 singlerace 的回复:]
当立即数处理。比如
i = i + 10000
这个10000,不是变量,不占数据空间。
[/Quote]

10000,不占空间那保存在哪里了?
singlerace 2009-02-05
  • 打赏
  • 举报
回复
当立即数处理。比如
i = i + 10000
这个10000,不是变量,不占数据空间。
xqhrs232 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 singlerace 的回复:]
高级的C++编译器在优化后const是不占内存的。
[/Quote]


不占内存,那它是放在那里?放在ROM(FLASH ROM)?要访问怎么办?能自动读到ROM空间吗?我看不见得!
singlerace 2009-02-05
  • 打赏
  • 举报
回复
const常量不放在哪个section里,因为如楼上所说,它不占存储空间。当然你非要较真,可以认为它在.text section里。这好比说
mov eax, 500
500放在哪个section?只能是.text了。
jgj58 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 xqhrs232 的回复:]
大家还不明白我的问题,我问的是这样做的作用是什么?可以节省内存?节省STACK空间?可以让程序跑的更快?加CONST在形成的二进制文件里面处在那个节里面(。CODE/TEXT),不加CONST又会是在那个节里面。处在不同的节有什么区别?
[/Quote]

这样做的作用是:
1.可以节省内存空间
从汇编看:const只是给出了对应的内存地址,这样定义的常量在程序运行过程中只有一份拷贝,不象#define定义的常量在内存中有若干个拷贝。
2.可以让程序更快
因为这样做提高了效率:编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,当然效率高程序会快点。

我以前是做vc开发的,对。CODE/TEXT也是刚刚开始研究,帮不上忙了呵呵。后面你的问题我弄清楚了在交流。
xqhrs232 2009-02-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jgj58 的回复:]
在C++里:const可用在全局量上

const定义是带有类型的,定义的是变量,它有实际内存,只是这个内存是不可以更改的。

所以从C++中提倡使用const变量,作用类似#define
[/Quote]

这样弄的好处是什么?
jgj58 2009-02-04
  • 打赏
  • 举报
回复
在C++里:const可用在全局量上

const定义是带有类型的,定义的是变量,它有实际内存,只是这个内存是不可以更改的。

所以从C++中提倡使用const变量,作用类似#define
xqhrs232 2009-02-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 singlerace 的回复:]
extern声明的作用是编译时把AirBtn_Pos放入全局符号表,这样链接时接链接器时才能找到。const和非const的区别可能是,非const全局变量如果不指定static,默认情况下放入全局符号表,而const变量不放。这些是我的猜测。
用const修饰的全局变量除了程序中不能修改外,编译器会把它优化成常量处理,相当于C的#define。这样就不需要为它分配空间。

ARM下ROM可以当RAM使用吗?
任何情况下ROM都不能当RAM使,否则还能叫ROM吗。
[/Quote]


我记得有些单片机是可以的------像AT89C55WD。把不变的数组定义成CODE类型就不用占RAM空间的!
singlerace 2009-02-04
  • 打赏
  • 举报
回复
extern声明的作用是编译时把AirBtn_Pos放入全局符号表,这样链接时接链接器时才能找到。const和非const的区别可能是,非const全局变量如果不指定static,默认情况下放入全局符号表,而const变量不放。这些是我的猜测。
用const修饰的全局变量除了程序中不能修改外,编译器会把它优化成常量处理,相当于C的#define。这样就不需要为它分配空间。

ARM下ROM可以当RAM使用吗?
任何情况下ROM都不能当RAM使,否则还能叫ROM吗。
friendfish 2009-02-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 xqhrs232 的帖子:]
WINCE+ARM的系统,把全局不变的数组加一个const修饰符能起到什么作用?减少内存的占用?提高程序执行速度?ARM下ROM可以当RAM使用吗?
[/Quote]

呵呵,const对于我们程序员来说,就是常量,恩,准确点应该是只读,不能修改,修改的话,编译器会报错,那么对于编译后的代码,有什么左右呢?呵呵,如果给以个变量加上const修饰符后,那么他将会位于“.text"段,和字符串等位于一段,该段是不能进行读写的。
navi_dx 2009-02-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xqhrs232 的回复:]
还有个怪现象

在A。CPP里面定义了

const int AirBtn_Pos[7][2]


在B。CPP里面引用

extern const int AirBtn_Pos[7][2]


这样编译老是报错-----1>B.obj : error LNK2001: 无法解析的外部符号 "int (* AirBtn_Pos)[2]" (?AirBtn_Pos@@3PAY01HA)


为什么?
[/Quote]

const 不能作为全局全局量引用,编译时被限制为Static只在对象的内部可见,外部可见会被标示为External
在A.CPP里面定义了
const int AirBtn_Pos[7][2]
在B.CPP里面也定义
const int AirBtn_Pos[7][2]
是两个不同的实例,相互之间没有关系,也不能在其他文件引用

const 会被加入rdata段,这是个Readonly段,修改这里面的数据会引发一个expert,防止程序在运行过程中改变数据
不会减少内存的占用,但是会减少stack的占用,否则数据会被放到stack,对于大规模数据节约stack很有意义
ROM可以当RAM使用,你也太有才了,norflash确实可以XIP,但和RAM是两个概念,
xumercury 2009-02-04
  • 打赏
  • 举报
回复
怪异了。。我刚写了东西怎么没有了
这个错误可能的问题是重复定义或者定义后的使用与定义的中的操作方法不匹配导致的。
xumercury 2009-02-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xqhrs232 的回复:]
还有个怪现象

在A。CPP里面定义了

const int  AirBtn_Pos[7][2]


在B。CPP里面引用

extern const int  AirBtn_Pos[7][2]


这样编译老是报错-----1>B.obj : error LNK2001: 无法解析的外部符号 "int (* AirBtn_Pos)[2]" (?AirBtn_Pos@@3PAY01HA)

有重复定义或两次使用时候参数与最先定义时的标准不同可能会造成这样的错误。

为什么?

[/Quote]
xqhrs232 2009-02-04
  • 打赏
  • 举报
回复
顶起来一下
xyj0663 2009-02-04
  • 打赏
  • 举报
回复
const有类型检测而define只是简单的数值替换, const比define要好些
加载更多回复(8)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧