[讨论] 【靠谱例程联盟】 20131231 malloc/free 和 堆 的问题,本质上是 (堆)内存管理

辛昕   2013-12-31 18:06 楼主
我实在无意引起新一波讨论: 关于在单片机上使用malloc/free的问题。 我之前写了一个基于 malloc/free的 CStyleString.作为一个做单片机为主的我来说,我当然是希望它们可以用于单片机。是的,也许String功能对于单片机意义不大,但是类似于的vector意义可就大了。而它们同样涉及这对 堆内存管理 的需求。 我知道你们随便跑出一个人都会告诉我 "在单片机上用动态分配是找死。" ——或者类似的话。 然而,我还是决定继续往下走。此前,我翻阅了包括 PJP的C标准库,C和指针 在内的好几本 C经典,但发现它们只是提到怎么使用这些函数。却完全没有我想要的答案 “在单片机上动态分配内存,需要注意什么?” 这里面一个关键是,单片机这种资源稀缺型系统,内存非常有限。而且他不比PC机,随随便便就有一个操作系统——几乎所有的操作系统都提供了 内存管理功能。我知道一些嵌入式操作系统的大致方案,就是一点都不动态,是使用静态内存。 其实C标准库本身,与任何操作系统的实现无关,也不依赖操作系统,因此它本身是非常独立的。而且阅读C标准库你会发现,其实C的实现者并不只知道PC机和windows或者linux。他们同样知道其他各类包括我们的单片机在内的各种 计算机硬件。 因此它们已经考虑得够多了。 而很多时候我只希望,我可以,“妥善的使用,正确的使用 已经有的成熟技术”,然后免除许多麻烦。 一直忘了今天是2013年最后一天,所幸,花了几个晚上考虑的一个问题,总算找到一个更贴切的 路标: 内存管理 本帖最后由 辛昕 于 2013-12-31 21:03 编辑
强者为尊,弱者,死无葬身之地

回复评论 (5)

在单片机或者嵌入式系统里用动态分配其实没什么。堆只是传说中的概念,从本质上讲,堆只是一个静态全局数组,操作它的外部接口函数只有malloc和free。很多小型嵌入式系统都提供了动态申请内存的方法,只不过,出于空间效率和时间效率的考虑,更多的时候可能会考虑使用所谓不动态的固定块的方式,很少的时候,也会有使用按字节分配的方式。“动态申请内存”,不过就是一个拥有“巨大”内存空间(数组)的模块而已,我们只是调它的接口,向它借用空间,并适时归还。所谓动态的机制,无非就是这个模块的实现手段罢了。

在我眼里,变量没有谭老师书里讲的那么复杂,而是只有两种:局部的变量,在调用栈里临时保存;全局的变量,在内存中长久保存。
再进一步,其实栈也不过就是一个全局的数组而已。
点赞  2014-1-1 01:46
用c++的string或者vector干
然后封装一个 c接口即可。

这是我后来想到的最好的办法。
我是说,在单片机上用。

1941
强者为尊,弱者,死无葬身之地
点赞  2017-11-13 18:16
引用: 辛昕 发表于 2017-11-13 18:16
用c++的string或者vector干
然后封装一个 c接口即可。

这是我后来想到的最好的办法。
我是说,在单片 ...

String和Vector也是通过动态申请来实现的,so,你用他们一点意义都没有,还不如直接调用malloc/free
点赞  2017-11-13 19:51
引用: lcofjp 发表于 2017-11-13 19:51
String和Vector也是通过动态申请来实现的,so,你用他们一点意义都没有,还不如直接调用malloc/free

然而c++这种语言不是自带一定的gc机制么?
总好过C没有,要依靠操作系统提供的吧。
强者为尊,弱者,死无葬身之地
点赞  2017-11-14 00:22

原来在2013年,我果然是一点都不知道RTOS

强者为尊,弱者,死无葬身之地
点赞  2023-10-6 18:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复