社区
嵌入开发(WinCE)
帖子详情
WINCE+ARM的系统,把全局不变的数组加一个const修饰符能起到什么作用?减少内存的占用?提高程序执行速度?ARM下ROM可以当RAM使用吗?
xqhrs232
2009-02-03 04:51:25
WINCE+ARM的系统,把全局不变的数组加一个const修饰符能起到什么作用?减少内存的占用?提高程序执行速度?ARM下ROM可以当RAM使用吗?
...全文
560
28
打赏
收藏
WINCE+ARM的系统,把全局不变的数组加一个const修饰符能起到什么作用?减少内存的占用?提高程序执行速度?ARM下ROM可以当RAM使用吗?
WINCE+ARM的系统,把全局不变的数组加一个const修饰符能起到什么作用?减少内存的占用?提高程序执行速度?ARM下ROM可以当RAM使用吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
嵌入式软件
static限制
作用
域在C语言中,关键字static有三个明显的
作用
:1)、用static修饰局部变量:使其变为静态存储方式,那么这个局部变量执行完成时不会被释放,继续保留在
内存
中。2)、用static修饰
全局
变量:使其在本...
嵌入式
系统
试题库(CSU)
2、
ARM
支持两个指令集,
ARM
核因运行的指令集不同,分别有两个状态
ARM
、 Thumb ,状态寄存器CPSR的 T 位反映了处理器运行不同指令的当前状态 3、
ARM
核有多个寄存器,其中大部分用于通用寄存器,有小部分作为专用...
note_2017_3.c
Thumb指令是16位代码密度,
ARM
是32位代码密度,所以Thumb指令的代码密度要高于
ARM
指令,Thumb指令只是
ARM
指令的
一个
子集,不是完整的体系结构 对51或
ARM
内核应该掌握哪些东西? 指令
系统
、中断处理
系统
、寄存器...
嵌入式软件高频面试题
进程是资源(CPU、
内存
等)分配的基本单位,线程是CPU调度和分配的基本单位(
程序执行
的最小单位)。同一时间,如果CPU是单核,只有
一个
进程在执行,所谓的并发执行,也是顺序执行,只不过由于切换
速度
太快,你以为...
嵌入式软件开发基础问题
linux和windows的换行符有什么不同? 了解shell脚本么,写过什么? 用过fgets等读取文件的函数么? open函数传入什么参数?什么模式?参数怎么写? 给你
一个
不联网的电脑,怎么找关于grep的用法? 有没有自己编译过...
嵌入开发(WinCE)
19,502
社区成员
41,568
社区内容
发帖
与我相关
我的任务
嵌入开发(WinCE)
硬件/嵌入开发 嵌入开发(WinCE)
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章