搜索
bottom↓
回复: 6

请教Gorgon,关于malloc函数

[复制链接]

出0入0汤圆

发表于 2013-7-5 10:45:29 | 显示全部楼层 |阅读模式
本帖最后由 guew 于 2013-7-5 10:53 编辑

最近看uml+oopc,对malloc有些顾忌。

单片机中用malloc动态分配内存的方式,有什么利弊?
单片机没有runtime概念,其内存如何管理?比方说,在一个函数中malloc了一片内存,那么退出该函数后,如果用户不手动free,此片内存是否一直被占着,造成浪费?
这种方法是否还会造成不确定性?比方说在运行时malloc了太多内存,造成程序运行的不确定,跑着跑着内存不够了。相比静态的内存分配,编译器在编译时就能算计出内存的使用量,从而从根本上保证(让用户知道)内存使用不会超标?

出0入296汤圆

发表于 2013-7-5 13:00:24 | 显示全部楼层
runtime的概念是一直有的,但是这里应该不是你说的runtime。
malloc要看具体算法,普通算法会造成内存碎片。
因为C语言和C++没有垃圾收集,所以内存分配以后一定需要手动free掉,否则一直占着。
因为内存碎片的存在,有会导致heap中有效内存逐步减少的风险。

所以一般在单片机中,如果要用到heap,请使用专用heap。就是为专门的对象建立专门的heap。这样不会产生内存碎片,heap维护的代码也简单可靠。
简单说下专用heap,简单的专用heap可能连链表都不用,直接建立下面的数据结构,比如

  1. typedef struct {
  2.     xxxxx_t    tOBJ;
  3.     bool  bAllocated;
  4. }xxxx_heap_item;
复制代码
其中xxxxx_t就是你要进行动态内存分配的对象类型(类)。然后利用这个xxxx_heap_item建立一个
数组,用里面的标志来表示是否分配了。free就是把对应对象的bAllocated设置成false。malloc就是
用一个搜索算法查找数组里面的bAllocated为false的元素,然后将其标志为true即可。
这种方法简单,稳定,在元素较少时,效率和代码尺寸较为平均,但缺点是扩展性较差,元素较多时
效率较差。
另外一种方法就是用单链表,构建一个freelist。算法效率高,尺寸小。值得推荐,这里不再赘述。

出0入0汤圆

发表于 2013-7-5 14:18:07 来自手机 | 显示全部楼层
听傻孩子老师讲课

出0入0汤圆

发表于 2013-7-5 14:28:43 | 显示全部楼层
只要malloc每次申请的空间不是一样大的,总会产生内存碎片,所以RAM很小的单片机就千万别用malloc。

出0入0汤圆

 楼主| 发表于 2013-7-7 19:56:25 | 显示全部楼层
3Q楼上诸位!
Gorgon大人,您这里是好地方哈!
怎么说来着,知识的海洋~

出0入0汤圆

 楼主| 发表于 2013-9-10 10:28:55 | 显示全部楼层
最近看 event driven programming,里面讲到了内存管理,很有启发。
其基本机制如下:
1. 用结构数组的形式向编译器要一片连续的内存
2. 用算法保证这片内存内的每小块内存等长,并且其都是内存对齐的
3. 用链表的形式链接这些内存块
4. 用get和put函数实现捞内存与还内存

出0入0汤圆

发表于 2013-9-10 14:58:19 | 显示全部楼层
单片机搞动态分配太危险了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 03:14

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

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