jadegu 发表于 2024-1-25 10:05:15

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

定义数组过长链接报错undefined reference to `memcpy',

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

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

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

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

wye11083 发表于 2024-1-25 11:20:10

没毛病啊,static的话就自动编译成全局变量了(static表示仅对代码后面生效的全局变量)。mcu从效率和资源占用角度考虑,const通常都最好全局。

tang_qianfeng 发表于 2024-1-25 11:24:12

const的不应该是常量么?

albert_w 发表于 2024-1-25 14:17:31

你不怕爆栈吗

1a2b3c 发表于 2024-1-25 14:52:36

看不懂你们c语言或者折腾编译器的高手怎么折腾这些,反正对我来说无非就是flash里面固定存储的一些数而已,直接找个位置写到那里不就完了,读的时候去对应flash位置取数就好了:)哈哈😄

yuyu87 发表于 2024-1-25 15:30:49

为啥要这样玩?加个static const就好了。

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

1a2b3c 发表于 2024-1-25 15:46:43

或者再加上针对特定编译器的关键词,比如有些是flash,有些是rom等等
猜测楼主是搞电脑软件的转来的,不是所谓嵌入式人

kebaojun305 发表于 2024-1-25 17:22:18

yuyu87 发表于 2024-1-25 15:30
为啥要这样玩?加个static const就好了。

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

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

albert_w 发表于 2024-1-25 17:35:40

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

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

jadegu 发表于 2024-1-25 21:55:51

谢谢坛友的回复,看来我还得打牢基础。。

xy3dg12 发表于 2024-1-26 10:17:21

我也做过没有标准C库的项目,解决办法就是自己写一个memcpy。不考虑效率的话,就直接C语言一个字节一个字节的copy。如果你这个数组确实不需要修改的话,加static 最好。

jathenal 发表于 2024-1-26 11:28:35

嵌入式开发,用memcpy往栈空间里灌内容……就是PC开发,也不敢打这么富裕的仗啊。
比起解决这个具体问题,建议还是调整下设计方案吧。

xy3dg12 发表于 2024-1-26 11:38:01

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

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

jathenal 发表于 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本身就适合放在全局内存,被直接引用,而不是再创建副本;
真有可变副本需求,建议也要确认下副本大小,几十字节的结构体可以放到栈里,再大的最好就使用堆空间了;
以上都是交过“学费”得出的经验,供参考。

xy3dg12 发表于 2024-1-26 13:09:43

看看keil是怎么初始化一个16个元素的局部变量的。

zouzhichao 发表于 2024-1-28 13:26:26

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

调试器牛逼

xy3dg12 发表于 2024-1-29 10:27:40

zouzhichao 发表于 2024-1-28 13:26
调试器牛逼
(引用自16楼)

呵呵,识货
现在咸鱼也很便宜,3000左右,比KEIL好使多了。
页: [1]
查看完整版本: 提问:如何让编译器不自动调用memcpy初始化const局部变量?