9180|28

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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

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

最新回复

const 比#DEFINE有优势谁都知道,因为effective in c++里面说的很清楚了。我想知道的是,对于全局的大数组加CONST修饰的作用与优势!讨论不是STACK/HEAP里面的临时个别变量(不是立即数)。  详情 回复 发表于 2009-2-6 08:37
点赞 关注
 

回复
举报

59

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
还有个怪现象

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


为什么?
此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
const是告诉大家,这个数组是常量,不能修改的。
用来防止意外修改。

如果在程序中修改就会出错。
此帖出自WindowsCE论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 
难道CONST后就不能被其它文件引用了?
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
找到了一个::
请注意:extern   const   int   i=0;   //定义   
  extern   const   int   i;//声明,使用其它文件定义的i   


//========声明的时候也要加EXTERN ,不过还是觉得怪怪的!那在声明的那个文件能使用吗?
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
声明的时候不能够在重新赋值

在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去掉看行不行,呵呵
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
顶起来一下
此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 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)

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

为什么?

此帖出自WindowsCE论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

9
 
怪异了。。我刚写了东西怎么没有了
这个错误可能的问题是重复定义或者定义后的使用与定义的中的操作方法不匹配导致的。
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 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是两个概念,
此帖出自WindowsCE论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(中级)

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


呵呵,const对于我们程序员来说,就是常量,恩,准确点应该是只读,不能修改,修改的话,编译器会报错,那么对于编译后的代码,有什么左右呢?呵呵,如果给以个变量加上const修饰符后,那么他将会位于“.text"段,和字符串等位于一段,该段是不能进行读写的。
此帖出自WindowsCE论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

12
 
extern声明的作用是编译时把AirBtn_Pos放入全局符号表,这样链接时接链接器时才能找到。const和非const的区别可能是,非const全局变量如果不指定static,默认情况下放入全局符号表,而const变量不放。这些是我的猜测。
用const修饰的全局变量除了程序中不能修改外,编译器会把它优化成常量处理,相当于C的#define。这样就不需要为它分配空间。

ARM下ROM可以当RAM使用吗?
任何情况下ROM都不能当RAM使,否则还能叫ROM吗。
此帖出自WindowsCE论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

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

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



我记得有些单片机是可以的------像AT89C55WD。把不变的数组定义成CODE类型就不用占RAM空间的!
此帖出自WindowsCE论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

14
 
在C++里:const可用在全局量上

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

所以从C++中提倡使用const变量,作用类似#define
此帖出自WindowsCE论坛
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 13 楼 jgj58 的回复:
在C++里:const可用在全局量上

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

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


这样弄的好处是什么?
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

16
 
高级的C++编译器在优化后const是不占内存的。
此帖出自WindowsCE论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 12 楼 xqhrs232 的回复:
我记得有些单片机是可以的------像AT89C55WD。把不变的数组定义成CODE类型就不用占RAM空间的!

这个意思是说只读数据可以放到ROM里,不占RAM空间,不是说ROM能当RAM使。他们的共同点是都支持线性随机读取,除此之外RAM还支持线性随机写入,这个区别要搞清楚。只要是支持线性随机读取的存储器,理论上const和代码就可以放在里面,不占RAM空间-当然前提是你的开发工具要支持。
此帖出自WindowsCE论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 14 楼 xqhrs232 的回复:
引用 13 楼 jgj58 的回复:
在C++里:const可用在全局量上

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

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


这样弄的好处是什么?


Const 的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点
此帖出自WindowsCE论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

19
 
const有类型检测而define只是简单的数值替换, const比define要好些
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 15 楼 singlerace 的回复:
高级的C++编译器在优化后const是不占内存的。



不占内存,那它是放在那里?放在ROM(FLASH ROM)?要访问怎么办?能自动读到ROM空间吗?我看不见得!
此帖出自WindowsCE论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表