提问:如何让编译器不自动调用memcpy初始化const局部变量?
定义数组过长链接报错undefined reference to `memcpy',局部const数组过长时编译器自动调用memcpy对栈变量进行初始化,
如果没链接stdlib就找不到memcpy,
将数组定义为static const类型不初始化到栈里就不会调用memcpy
如何让编译器不自动调用memcpy初始化const局部变量? 没毛病啊,static的话就自动编译成全局变量了(static表示仅对代码后面生效的全局变量)。mcu从效率和资源占用角度考虑,const通常都最好全局。 const的不应该是常量么? 你不怕爆栈吗 看不懂你们c语言或者折腾编译器的高手怎么折腾这些,反正对我来说无非就是flash里面固定存储的一些数而已,直接找个位置写到那里不就完了,读的时候去对应flash位置取数就好了:)哈哈😄 为啥要这样玩?加个static const就好了。
不加static,只用const,那么是定义在RAM中的,加了static就定义在flash中了。 或者再加上针对特定编译器的关键词,比如有些是flash,有些是rom等等
猜测楼主是搞电脑软件的转来的,不是所谓嵌入式人 yuyu87 发表于 2024-1-25 15:30
为啥要这样玩?加个static const就好了。
不加static,只用const,那么是定义在RAM中的,加了static就定义 ...
(引用自6楼)
编译器都没说 你这么那么确定 const 是存在ram 中的{:lol:} 1a2b3c 发表于 2024-1-25 14:52
看不懂你们c语言或者折腾编译器的高手怎么折腾这些,反正对我来说无非就是flash里面固定存储的一些数而已, ...
(引用自5楼)
你这个其实最好了,不占用全局内存 谢谢坛友的回复,看来我还得打牢基础。。 我也做过没有标准C库的项目,解决办法就是自己写一个memcpy。不考虑效率的话,就直接C语言一个字节一个字节的copy。如果你这个数组确实不需要修改的话,加static 最好。 嵌入式开发,用memcpy往栈空间里灌内容……就是PC开发,也不敢打这么富裕的仗啊。
比起解决这个具体问题,建议还是调整下设计方案吧。 jathenal 发表于 2024-1-26 11:28
嵌入式开发,用memcpy往栈空间里灌内容……就是PC开发,也不敢打这么富裕的仗啊。
比起解决这个具体问题, ...
(引用自12楼)
现在嵌入式有几百K的ram也很常见了。
这个memcpy是编译器调用的,相对安全,就像相信编译器一样相信它吧。 本帖最后由 jathenal 于 2024-1-26 11:53 编辑
xy3dg12 发表于 2024-1-26 11:38
现在嵌入式有几百K的ram也很常见了。
这个memcpy是编译器调用的,相对安全,就像相信编译器一样相信它吧 ...
(引用自13楼)
几百K,在PC那几十上百G面前,差了几个数量级?
后者都不敢这么挥霍,碰到个递归调用分分钟爆栈,更别说前者。
另外,栈分配并不单纯归编译器管,就算我相信编译器,也不敢全信链接器的默认栈配置。
其实,这个问题关键其实不在RAM容量大小,而是设计方案。
const本身就适合放在全局内存,被直接引用,而不是再创建副本;
真有可变副本需求,建议也要确认下副本大小,几十字节的结构体可以放到栈里,再大的最好就使用堆空间了;
以上都是交过“学费”得出的经验,供参考。 看看keil是怎么初始化一个16个元素的局部变量的。
xy3dg12 发表于 2024-1-26 13:09
看看keil是怎么初始化一个16个元素的局部变量的。
(引用自15楼)
调试器牛逼 zouzhichao 发表于 2024-1-28 13:26
调试器牛逼
(引用自16楼)
呵呵,识货
现在咸鱼也很便宜,3000左右,比KEIL好使多了。
页:
[1]