易码技术论坛

 找回密码
 加入易码
搜索
查看: 1958|回复: 6

[源码] [原创][我的新malloc代码]

[复制链接]
发表于 2007-12-1 09:58:36 | 显示全部楼层 |阅读模式
此代码和原来的代码一样也采用了从可用内存的最大位置开始分配.
同时提高了运行效率和内存使用率,在内存信息的使用上只占两字节,而且很大程度上化简了代码(LavaX下运行).
  1. int _pMMax = 0x7000;
  2. int _pMHead = 0x7000;
  3. /*struct _MemoryInfo{
  4.     bool bUsed : 1;
  5.     short nSize : 31;
  6. };*/

  7. int malloc(int _NewSize)
  8. {
  9.     int _nSize;
  10.     int &_rMInfo;
  11.     int &_rMInfoNext;
  12.     &_rMInfo = _pMHead;
  13.    
  14.     while (&_rMInfo < _pMMax){
  15.         if (_rMInfo > 0){
  16.             goto L_CombineLoopStart;
  17.             while (_rMInfoNext > 0 && &_rMInfoNext < _pMMax){
  18.                 _rMInfo = _rMInfo + _rMInfoNext + sizeof(int);
  19. L_CombineLoopStart:        &_rMInfoNext = &_rMInfo + _rMInfo + sizeof(int);
  20.             }
  21.             
  22.             if (_rMInfo >= _NewSize){
  23.                 if (_rMInfo > _NewSize){
  24.                     &_rMInfoNext = &_rMInfo + (_nSize = _NewSize + sizeof(int));
  25.                     _rMInfoNext = _rMInfo - _nSize;
  26.                     _rMInfo = _NewSize;
  27.                 }
  28.                 _rMInfo = _rMInfo | 0x8000;
  29.                 return &_rMInfo + sizeof(int);
  30.             }
  31.         }
  32.         &_rMInfo = &_rMInfo + (_rMInfo & 0x7FFF) + sizeof(int);
  33.     }
  34.     if (_pMHead)
  35.         &_rMInfo = _pMHead;
  36.     else
  37.         &_rMInfo = _pMMax;
  38.     if (&_NewSize + 16 > &_rMInfo - _NewSize)
  39.         return 0;
  40.     &_rMInfo = (_pMHead = &_rMInfo - _NewSize - sizeof(int));
  41.     _rMInfo = 0x8000 | _NewSize;
  42.     return &_rMInfo + sizeof(int);
  43. }

  44. void free(int &_rMInfo)
  45. {
  46.     &_rMInfo = &_rMInfo - 2;
  47.     _rMInfo = _rMInfo & 0x7FFF;
  48.     if (&_rMInfo == _pMHead)
  49.             _pMHead = &_rMInfo + _rMInfo + sizeof(int);
  50. }
复制代码
下面是限制固定范围内使用内存的分配代码,原理同上.
  1. int _pMStart = 0x5000;
  2. int _nMSize = 0x2000;
  3. int _pMEnd = NULL;
  4. /*struct _MemoryInfo{
  5.     bool bUsed : 1;
  6.     short nSize : 31;
  7. };*/
  8. void SetAllocationRange(int _pMRangeStart, int _pMRangeSize)
  9. {
  10.     _pMStart = _pMRangeStart;
  11.     _nMSize = _pMRangeSize;
  12.     _pMEnd = NULL;
  13. }

  14. int malloc(int _NewSize)
  15. {
  16.     int _nSize;
  17.     int &_rMInfo;
  18.     int &_rMInfoNext;
  19.     &_rMInfo = _pMStart;
  20.    
  21.     while (&_rMInfo < _pMEnd){
  22.         if (_rMInfo > 0){
  23.             goto L_CombineLoopStart;
  24.             while (_rMInfoNext > 0 && &_rMInfoNext < _pMEnd){
  25.                 _rMInfo = _rMInfo + _rMInfoNext + sizeof(int);
  26. L_CombineLoopStart:        &_rMInfoNext = &_rMInfo + _rMInfo + sizeof(int);
  27.             }
  28.             
  29.             if (_rMInfo >= _NewSize){
  30.                 if (_rMInfo > _NewSize){
  31.                     &_rMInfoNext = &_rMInfo + (_nSize = _NewSize + sizeof(int));
  32.                     _rMInfoNext = _rMInfo - _nSize;
  33.                     _rMInfo = _NewSize;
  34.                 }
  35.                 _rMInfo = _rMInfo | 0x8000;
  36.                 return &_rMInfo + sizeof(int);
  37.             }
  38.         }
  39.         &_rMInfo = &_rMInfo + (_rMInfo & 0x7FFF) + sizeof(int);
  40.     }
  41.    
  42.     if (_NewSize + &_rMInfo > _pMStart + _nMSize)
  43.         return 0;

  44.     _rMInfo = 0x8000 | _NewSize;
  45.     _pMEnd = &_rMInfo + _NewSize + sizeof(int);
  46.     return &_rMInfo + sizeof(int);
  47. }

  48. void free(int &_rMInfo)
  49. {
  50.     &_rMInfo = &_rMInfo - 2;
  51.     _rMInfo = _rMInfo & 0x7FFF;
  52. }
复制代码

[ 本帖最后由 gameghost 于 2007-12-21 20:03 编辑 ]
发表于 2007-12-1 12:23:15 | 显示全部楼层
非常不错,收下了。
就是free函数不太安全。
发表于 2008-1-19 19:35:28 | 显示全部楼层
这个函数时干什么用的?
发表于 2008-1-20 17:00:20 | 显示全部楼层
YAN编译器中的此函数连接库更新了吗?
 楼主| 发表于 2008-1-20 17:53:19 | 显示全部楼层
原帖由 yan 于 2007-12-1 12:23 发表
非常不错,收下了。
就是free函数不太安全。

不是不太安全,是原来有错误....
 楼主| 发表于 2008-1-20 17:54:10 | 显示全部楼层
原帖由 black 于 2008-1-20 17:00 发表
YAN编译器中的此函数连接库更新了吗?

话说直接#include不就行了?..........
发表于 2008-1-20 21:06:06 | 显示全部楼层
原帖由 gameghost 于 2008-1-20 17:54 发表

话说直接#include不就行了?..........

我考虑是否把它做成.y文件……
WQX端编译时省时间
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-29 20:19 , Processed in 0.009301 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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