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

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

回复评论 (28)

还有个怪现象

在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)


为什么?
点赞  2009-2-3 17:04
const是告诉大家,这个数组是常量,不能修改的。
用来防止意外修改。

如果在程序中修改就会出错。
点赞  2009-2-3 17:16
难道CONST后就不能被其它文件引用了?
点赞  2009-2-3 17:16
找到了一个::
请注意:extern   const   int   i=0;   //定义   
  extern   const   int   i;//声明,使用其它文件定义的i   


//========声明的时候也要加EXTERN ,不过还是觉得怪怪的!那在声明的那个文件能使用吗?
点赞  2009-2-3 17:31
声明的时候不能够在重新赋值

在B。CPP里面引用
extern const int  AirBtn_Pos[7][2]
这样编译老是报错-----1>B.obj : error LNK2001: 无法解析的外部符号 "int (* AirBtn_Pos)[2]" (?AirBtn_Pos@@3PAY01HA)

应该是[7][2]这里有问题,猜的,不知是不是,你把7和2去掉看行不行,呵呵
点赞  2009-2-3 18:31
顶起来一下
点赞  2009-2-4 09:09
引用: 引用 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)

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

为什么?
点赞  2009-2-4 09:29
怪异了。。我刚写了东西怎么没有了
这个错误可能的问题是重复定义或者定义后的使用与定义的中的操作方法不匹配导致的。
点赞  2009-2-4 09:30
引用: 引用 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)


为什么?


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是两个概念,
点赞  2009-2-4 10:31
引用: 引用楼主 xqhrs232 的帖子:
WINCE+ARM的系统,把全局不变的数组加一个const修饰符能起到什么作用?减少内存的占用?提高程序执行速度?ARM下ROM可以当RAM使用吗?


呵呵,const对于我们程序员来说,就是常量,恩,准确点应该是只读,不能修改,修改的话,编译器会报错,那么对于编译后的代码,有什么左右呢?呵呵,如果给以个变量加上const修饰符后,那么他将会位于“.text"段,和字符串等位于一段,该段是不能进行读写的。
点赞  2009-2-4 11:00
extern声明的作用是编译时把AirBtn_Pos放入全局符号表,这样链接时接链接器时才能找到。const和非const的区别可能是,非const全局变量如果不指定static,默认情况下放入全局符号表,而const变量不放。这些是我的猜测。
用const修饰的全局变量除了程序中不能修改外,编译器会把它优化成常量处理,相当于C的#define。这样就不需要为它分配空间。

ARM下ROM可以当RAM使用吗?
任何情况下ROM都不能当RAM使,否则还能叫ROM吗。
点赞  2009-2-4 11:47
引用: 引用 11 楼 singlerace 的回复:
extern声明的作用是编译时把AirBtn_Pos放入全局符号表,这样链接时接链接器时才能找到。const和非const的区别可能是,非const全局变量如果不指定static,默认情况下放入全局符号表,而const变量不放。这些是我的猜测。
用const修饰的全局变量除了程序中不能修改外,编译器会把它优化成常量处理,相当于C的#define。这样就不需要为它分配空间。

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



我记得有些单片机是可以的------像AT89C55WD。把不变的数组定义成CODE类型就不用占RAM空间的!
点赞  2009-2-4 12:15
在C++里:const可用在全局量上

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

所以从C++中提倡使用const变量,作用类似#define
点赞  2009-2-4 12:29
引用: 引用 13 楼 jgj58 的回复:
在C++里:const可用在全局量上

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

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


这样弄的好处是什么?
点赞  2009-2-4 12:32
高级的C++编译器在优化后const是不占内存的。
点赞  2009-2-4 13:16
引用: 引用 12 楼 xqhrs232 的回复:
我记得有些单片机是可以的------像AT89C55WD。把不变的数组定义成CODE类型就不用占RAM空间的!

这个意思是说只读数据可以放到ROM里,不占RAM空间,不是说ROM能当RAM使。他们的共同点是都支持线性随机读取,除此之外RAM还支持线性随机写入,这个区别要搞清楚。只要是支持线性随机读取的存储器,理论上const和代码就可以放在里面,不占RAM空间-当然前提是你的开发工具要支持。
点赞  2009-2-4 13:21
引用: 引用 14 楼 xqhrs232 的回复:
引用 13 楼 jgj58 的回复:
在C++里:const可用在全局量上

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

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


这样弄的好处是什么?


Const 的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点
点赞  2009-2-4 13:45
const有类型检测而define只是简单的数值替换, const比define要好些
点赞  2009-2-4 15:56
引用: 引用 15 楼 singlerace 的回复:
高级的C++编译器在优化后const是不占内存的。



不占内存,那它是放在那里?放在ROM(FLASH ROM)?要访问怎么办?能自动读到ROM空间吗?我看不见得!
点赞  2009-2-5 08:31
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复