OpenEdv-开源电子网

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

define编译时占用内存吗

[复制链接]

2

主题

9

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-10-27
在线时间
4 小时
发表于 2016-6-22 08:11:18 | 显示全部楼层 |阅读模式
5金钱
@正点原子 之前在一本书上看到说,虽然define在预编译阶段不占用内存,但在编译阶段会占用内存。如************************************************
#define X 123.45
"define定义的不占内存" 指 X  不占内存.
define定义的宏,是预编译时的字符串替代。#define X 123.45 的作用是把程序中的 X 用 123.45 替代 再编译。 例如程序中 有:
y = X + 6.0;z = X / 7.0;
预编译时字符串替代为:
y = 123.45 + 6.0;
z = 123.45 / 7.0;
替代后 再编译, 仍然要 为 123.45 分配单元,放在常数区。
所以 X  不占内存,123.45 要占 内存。*******************************************************************************还有 #define PI 3.14159 //常量宏 const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
   double j=Pi; //没有内存分配
   double J=PI; //再进行宏替换,又一次分配内存!




那么问题来了,为什么STM32用了那么多define,如
#define CR_PG_Set                ((uint32_t)0x00000001)
#define CR_PG_Reset              ((uint32_t)0x00001FFE)
#define CR_PER_Set               ((uint32_t)0x00000002)
#define CR_PER_Reset             ((uint32_t)0x00001FFD)




这样不是很浪费内存吗,为什么不用const?


新手求解。谢谢!!

最佳答案

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

常数肯定要存储在rom区的某个位置的。 所以define定义的值,要占用rom。 另外,这些实际上不会占用很多,必须要用到的才会被编译,没用到的,直接就被编译器忽略了。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-6-22 08:11:19 | 显示全部楼层
常数肯定要存储在rom区的某个位置的。 所以define定义的值,要占用rom。  另外,这些实际上不会占用很多,必须要用到的才会被编译,没用到的,直接就被编译器忽略了。。。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11545
金钱
11545
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-6-22 08:48:46 | 显示全部楼层

不论用宏代替常数,还是直接把常数写进语句中,
编译以后都要在程序空间里占用位置。


所谓const同样要在程序空间占用位置,仅仅是集中占用一片区域而已。
不是const,则会分散在语句附近。


回复

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-6-22 08:58:19 | 显示全部楼层
继续顶2楼的签名。

STM32定义宏的目的很简单,你不用的时候就不会编译到,如果定义为const就没这个便利了,个人理解。
活到老,学到老。
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-6-22 09:08:57 | 显示全部楼层
其实如果你确认你的定义会被用到,建议用const,如果不确定,就用define。比较stm32的内存不大。define没被使用是不占任务内存的或者ROM的。但是const有他的优势。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

1

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2016-6-10
在线时间
19 小时
发表于 2016-6-22 09:25:15 | 显示全部楼层
#define如果是比较小的数,那么预编译后的指令实际变成了立即数操作,直接作为指令的一部分,不需要另外申请存储空间
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-10-27
在线时间
4 小时
 楼主| 发表于 2016-6-22 09:27:33 | 显示全部楼层
ysq7120 发表于 2016-6-22 09:08
其实如果你确认你的定义会被用到,建议用const,如果不确定,就用define。比较stm32的内存不大。define没被 ...

stm32的很多define肯定会被用到啊,特别是寄存器操作时。
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-10-27
在线时间
4 小时
 楼主| 发表于 2016-6-22 09:29:14 | 显示全部楼层
xuande 发表于 2016-6-22 08:48
不论用宏代替常数,还是直接把常数写进语句中,
编译以后都要在程序空间里占用位置。

const不是只分配一次内存吗。如
*****************************************
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
   double j=Pi; //没有内存分配
   double J=PI; //再进行宏替换,又一次分配内存!
******************************************
const只为Pi分配一次内存??????????????
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-6-22 09:49:28 | 显示全部楼层
zzz曾老师 发表于 2016-6-22 09:27
stm32的很多define肯定会被用到啊,特别是寄存器操作时。

不见得,我自己的也就用几个,项目主要核心在于fpga,stm32只是一个跑代码的平台。很多外设我都不用。这个东西看自己具体情况吧。当然对于stm32提供的库肯定不建议去修改他的宏,这是没事找事,有些也不见得就能改成const。自己项目中的可以考虑。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11545
金钱
11545
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-6-22 10:05:30 | 显示全部楼层
zzz曾老师 发表于 2016-6-22 09:29
const不是只分配一次内存吗。如
*****************************************
double i=Pi; //此时为Pi ...


const有可能只分配一次内存,
具体我也不知道。
个人觉得,已经没意义再深究,除非你做编译器。

define适合定义单个常数、字符串,
const适合做数表。


回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2016-6-22 10:19:06 | 显示全部楼层
编译时占内存,写入后不占内存。
编译占你自己电脑的内存,不占stm32芯片的内存
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 10:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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