搜索
bottom↓
回复: 16

提问:如何让编译器不自动调用memcpy初始化const局部变量?

[复制链接]

出15入70汤圆

发表于 2024-1-25 10:05:15 | 显示全部楼层 |阅读模式
定义数组过长链接报错undefined reference to `memcpy',

局部const数组过长时编译器自动调用memcpy对栈变量进行初始化,

如果没链接stdlib就找不到memcpy,

将数组定义为static const类型不初始化到栈里就不会调用memcpy

如何让编译器不自动调用memcpy初始化const局部变量?

出0入442汤圆

发表于 2024-1-25 11:20:10 | 显示全部楼层
没毛病啊,static的话就自动编译成全局变量了(static表示仅对代码后面生效的全局变量)。mcu从效率和资源占用角度考虑,const通常都最好全局。

出0入18汤圆

发表于 2024-1-25 11:24:12 | 显示全部楼层
const的不应该是常量么?

出0入42汤圆

发表于 2024-1-25 14:17:31 | 显示全部楼层
你不怕爆栈吗

出0入475汤圆

发表于 2024-1-25 14:52:36 来自手机 | 显示全部楼层
看不懂你们c语言或者折腾编译器的高手怎么折腾这些,反正对我来说无非就是flash里面固定存储的一些数而已,直接找个位置写到那里不就完了,读的时候去对应flash位置取数就好了:)哈哈😄

出20入186汤圆

发表于 2024-1-25 15:30:49 | 显示全部楼层
为啥要这样玩?加个static const就好了。

不加static,只用const,那么是定义在RAM中的,加了static就定义在flash中了。

出0入475汤圆

发表于 2024-1-25 15:46:43 来自手机 | 显示全部楼层
或者再加上针对特定编译器的关键词,比如有些是flash,有些是rom等等
猜测楼主是搞电脑软件的转来的,不是所谓嵌入式人

出0入8汤圆

发表于 2024-1-25 17:22:18 | 显示全部楼层
yuyu87 发表于 2024-1-25 15:30
为啥要这样玩?加个static const就好了。

不加static,只用const,那么是定义在RAM中的,加了static就定义 ...
(引用自6楼)

编译器都没说    你这么那么确定 const 是存在ram 中的  

出0入42汤圆

发表于 2024-1-25 17:35:40 | 显示全部楼层
1a2b3c 发表于 2024-1-25 14:52
看不懂你们c语言或者折腾编译器的高手怎么折腾这些,反正对我来说无非就是flash里面固定存储的一些数而已, ...
(引用自5楼)

你这个其实最好了,不占用全局内存

出15入70汤圆

 楼主| 发表于 2024-1-25 21:55:51 来自手机 | 显示全部楼层
谢谢坛友的回复,看来我还得打牢基础。。

出0入0汤圆

发表于 2024-1-26 10:17:21 | 显示全部楼层
我也做过没有标准C库的项目,解决办法就是自己写一个memcpy。不考虑效率的话,就直接C语言一个字节一个字节的copy。如果你这个数组确实不需要修改的话,加static 最好。

出0入0汤圆

发表于 2024-1-26 11:28:35 | 显示全部楼层
嵌入式开发,用memcpy往栈空间里灌内容……就是PC开发,也不敢打这么富裕的仗啊。
比起解决这个具体问题,建议还是调整下设计方案吧。

出0入0汤圆

发表于 2024-1-26 11:38:01 | 显示全部楼层
jathenal 发表于 2024-1-26 11:28
嵌入式开发,用memcpy往栈空间里灌内容……就是PC开发,也不敢打这么富裕的仗啊。
比起解决这个具体问题, ...
(引用自12楼)

现在嵌入式有几百K的ram也很常见了。
这个memcpy是编译器调用的,相对安全,就像相信编译器一样相信它吧。

出0入0汤圆

发表于 2024-1-26 11:51:37 | 显示全部楼层
本帖最后由 jathenal 于 2024-1-26 11:53 编辑
xy3dg12 发表于 2024-1-26 11:38
现在嵌入式有几百K的ram也很常见了。
这个memcpy是编译器调用的,相对安全,就像相信编译器一样相信它吧 ...
(引用自13楼)


几百K,在PC那几十上百G面前,差了几个数量级?
后者都不敢这么挥霍,碰到个递归调用分分钟爆栈,更别说前者。
另外,栈分配并不单纯归编译器管,就算我相信编译器,也不敢全信链接器的默认栈配置。

其实,这个问题关键其实不在RAM容量大小,而是设计方案。
const本身就适合放在全局内存,被直接引用,而不是再创建副本;
真有可变副本需求,建议也要确认下副本大小,几十字节的结构体可以放到栈里,再大的最好就使用堆空间了;
以上都是交过“学费”得出的经验,供参考。

出0入0汤圆

发表于 2024-1-26 13:09:43 | 显示全部楼层
看看keil是怎么初始化一个16个元素的局部变量的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出10入23汤圆

发表于 2024-1-28 13:26:26 | 显示全部楼层
xy3dg12 发表于 2024-1-26 13:09
看看keil是怎么初始化一个16个元素的局部变量的。
(引用自15楼)

调试器牛逼

出0入0汤圆

发表于 2024-1-29 10:27:40 | 显示全部楼层

呵呵,识货
现在咸鱼也很便宜,3000左右,比KEIL好使多了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 02:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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