• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

keil中,如果把全局变量加const,会使bin文件变大?

fangsichao 2019-01-23 浏览量:2131
如题,其他部分都没有修改,只是把全局定义的大数组加上const修饰符,最后生成的BIN文件就会变大,为什么呢?
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 变量加了const修饰符之后,变成了一个只读变量。

    我的理解是:

    const变量存储在只读数据段,第一次使用时为其分配内存​,在KEILL 里面是RO-DATA.

    11.jpg


     ROM(Flash) size = Code + RO-data + RW-data 
       RAM         size = RW-data + ZI-data        

    • 发布于 2019-01-23
    • 举报
    • 评论 5
    • 1
    • 0
2016大圣 回复了 川楠:点赞 回复
fangsichao 回复了 川楠:按照你这个说话,加了const,全局数值从RW-data变成了RO-data,生成的bin文件大小应该是不会差异很大的! 回复
川楠 回复了 川楠:我的理解是这样的,你没加const的时候,变量是存在ZI-data里面的。所以不占FLASH的空间,但是加了const时候,变量就放在了RO-data,所以就占用了FLASH空间。如果不对,欢迎指正。 回复
川楠 回复了 fangsichao:另外,我想到了一个好的方法去验证,你可以分别编译下两个代码,然后查看.map文件看一下你定义的变量的位置就清除明白了。 回复
fangsichao 回复了 川楠:我补充一下,全局数组的内容是我要引导的程序代码,不是空数组,所以不会写到ZI-data段 回复

其他答案 数量:14
  • 不会相差很大,因为你之前的变量有赋初值,所以也是先写在rom里面上电拷贝到ram里面,没有赋值的内存会小一些
    • 发布于2019-01-23
    • 举报
    • 评论 1
    • 0
    • 0
2016大圣 回复了 yhj416606438 :点赞 回复

  • 应该不会有很大的差别,加上const就变成只读变量了,这样一来就放在程序存储空间了,如果不加的话也是放在程序存储空间,但是上电的时候回复制到运行内存里。就是运行内存占用大小区别。
    • 发布于2019-01-23
    • 举报
    • 评论 3
    • 0
    • 0
2016大圣 回复了 我是假管贴心小助手 :点赞 回复
fangsichao 回复了 我是假管贴心小助手 :我实测的数据表明,全局数组大概2kb,加上const后,bin文件大小增加500kb左右 回复
fangsichao 回复了 我是假管贴心小助手 : ROM(Flash) size = Code + RO-data + RW-data,const只是指定数组存在RO还是RW,但是大小应该一样啊 回复

2016大圣 回复了 robe_zhang :点赞 回复

  • 是的,这时,空间就会点用上了,而不是动态分析 的了
    • 发布于2019-01-23
    • 举报
    • 评论 1
    • 0
    • 0
2016大圣 回复了 明有几时有 :点赞 回复

  • 11.jpg

    这个就是.MAP文件。

    我定义的 LedDatCtl   、UartRxDat全局量都是保存在内存中的,占用的大小也能看出来。

    • 发布于2019-01-25
    • 举报
    • 评论 1
    • 0
    • 0
fangsichao 回复了 川楠 :我看了map文件,确实是加了const之后,数组就被放到code段了,但是大小没变,可是生成的bin文件确变大了 回复

  • const 改变了变量的属性,就会让编译器改变变量的存放位置l
    • 发布于2019-01-29
    • 举报
    • 评论 0
    • 0
    • 0

  • 因为使用了const会把对应的数据放到flash中,所以处理数据会更大
    • 发布于2019-01-30
    • 举报
    • 评论 0
    • 0
    • 0

  • const变量存在全局数据区里面,会增大编译产生的文件大小。
    • 发布于2019-01-30
    • 举报
    • 评论 0
    • 0
    • 0

  • const变量是事先将数据赋值好,然后存到指定的flash位置,这个位置由这个数据独占,后续不可修改
    • 发布于2019-01-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 加const就表示常量了,那么就会存储在flash中,所以bin会变大
    • 发布于2019-01-31
    • 举报
    • 评论 0
    • 0
    • 0

  • 如果这样就会 改变数据的属性,编译存放位置也会有变化
    • 发布于2019-02-20
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个是因为里面的数据类型变化了,所以地址不同
    • 发布于2019-02-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 主要是存储的位置发生了变化,相对来说数据肯定会变化的
    • 发布于2019-02-28
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

keil中,如果把全局变量加const,会使bin文件变大?