定义

TLSF(全称Two-Level Segregated Fit)

源码

https://github.com/mattconte/tlsf

代码

结构体

typedef struct block_header_t {/* 指向上一个物理块。*/struct block_header_t * prev_phys_block;/* 此块的大小,不包括块头。*/size_t size;/* 下一个和上一个空闲块。*/struct block_header_t * next_free;struct block_header_t * prev_free;
} block_header_t;/*
**由于块大小始终至少是 4 的倍数,因此两个最小
** 大小字段的重要位用于存储块状态:
** - 位 0:块是忙还是空闲
** - 位 1:前一个块是忙碌还是空闲
*/static const size_t block_header_free_bit = 1 << 0;
static const size_t block_header_prev_free_bit = 1 << 1;/*已经使用的块已经使用的内存大小*/
static const size_t block_header_overhead = sizeof(size_t);/* 用户数据直接在已使用块中的大小字段之后开始。*/
static const size_t block_start_offset =offsetof(block_header_t, size) + sizeof(size_t);/*
*一个自由块的最小大小是整个存储空间减去头部说明
*更大的空间索引是FL_INDEX
*/
static const size_t block_size_min =sizeof(block_header_t) - sizeof(block_header_t *);
static const size_t block_size_max = tlsf_cast(size_t, 1) << FL_INDEX_MAX;/* TLSF 控制结构。*/
typedef struct control_t {/* 空列表指向此块以指示它们是空闲的。*/block_header_t block_null;/* 位图空闲列表。*/unsigned int fl_bitmap;unsigned int sl_bitmap[FL_INDEX_COUNT];/* 空闲列表的控制链表。*/block_header_t * blocks[FL_INDEX_COUNT][SL_INDEX_COUNT];
} control_t;/* 在执行指针算术时用于强制转换的类型。*/
typedef ptrdiff_t tlsfptr_t;

堆的创建

lv_tlsf_t lv_tlsf_create_with_pool(void * mem, size_t bytes)
{/*从mem开始初始化control_t*/lv_tlsf_t tlsf = lv_tlsf_create(mem);
/*堆开始空闲块开始的首地址要添加control_t的偏移,大小也是要减去control_t的大小*/lv_tlsf_add_pool(tlsf, (char *)mem + lv_tlsf_size(), bytes - lv_tlsf_size());return tlsf;
}
  • lv_tlsf_t tlsf = lv_tlsf_create(mem)作用:
    • 将bitmap清0,所有链表置空(指向block_null)
  • *lv_tlsf_add_pool(tlsf, (char )mem + lv_tlsf_size(), bytes - lv_tlsf_size())
    • 作用:初始化两个block,一个位于开头,作为最初也是最大的block,另一个位于结尾,是哨兵block
    • 将开头的那个block插入(头插)空闲链表

实例

  printf("Main Start!\n");// tlsf_destroy(tlsf);tlsf = tlsf_create_with_pool(0x13000000, 128 * 1024);char *name = tlsf_malloc(tlsf, 100);printf("name= %p\n ", name);for (int i = 0; i < 100; i++) {name[i] = i;printf("%d = 0x%x, ", i, name[i]);}printf("\n over \n");tlsf_free(tlsf, name);lv_tlsf_destroy(tlsf);

参考:
1、https://blog.csdn.net/gzxb1995/article/details/124504705
2、https://www.jianshu.com/p/01743e834432

动态内存管理——tlsf相关推荐

  1. 从结构体、内存池初始化到申请释放,详细解读鸿蒙轻内核的动态内存管理

    摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...

  2. 【C++】动态内存管理/move/以及移动构造与移动赋值运算符

    文章目录 1 .对象移动与右值引用 实际应用过程中遇到的问题及其解决方案 c++中临时变量不能作为非const的引用参数 2. 动态内存管理类 3. 对象移动与右值引用 4. 移动构造与移动复制运算符 ...

  3. C和C++安全编码笔记:动态内存管理

    4.1 C内存管理: C标准内存管理函数: (1).malloc(size_t size):分配size个字节,并返回一个指向分配的内存的指针.分配的内存未被初始化为一个已知值. (2).aligne ...

  4. 《C++应用程序性能优化::第五章动态内存管理》学习和理解

    <C++应用程序性能优化::第五章动态内存管理>学习和理解 说明:<C++应用程序性能优化> 作者:冯宏华等 2007年版. 2010.8.29 cs_wuyg@126.com ...

  5. C语言之动态内存管理与动态内存函数

    文章目录 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.malloc和free 2.calloc函数 3.realloc函数 一.为什么存在动态内存分配? 学习动态内存的管理方法之前,我们 ...

  6. FreeRTOS 之五 动态内存管理(heap_1.c)详解

    写在前面   写这篇文章时,网上已经有了铺天盖地的文章来介绍 FreeRTOS 的动态内存.之所以还去写这篇博文,主要还是记录自己的学习过程.结合源代码一步一步分析一下FreeRTOS究竟是怎么实现的 ...

  7. LwIP 之六 详解动态内存管理 内存池(memp.c/h)

      该文主要是接上一部分LwIP 之 详解动态内存管理 内存堆(mem.c/h),该部分许多内容需要用到上一篇的内容.该部分主要是详细介绍LwIP中的动态内存池.整个内存池的实现相较于内存堆来说,还是 ...

  8. LwIP 之五 详解动态内存管理 内存堆(mem.c/h)

    写在前面   目前网上有很多介绍LwIP内存的文章,但是绝大多数都不够详细,甚至很多介绍都是错误的!无论是代码的说明还是给出的图例,都欠佳!下面就从源代码,到图例详细进行说明.   目前,网络上多数文 ...

  9. C++ 动态内存管理:c/c++的动态内存管理,new/delete,operator new/delete,placement-new, 内存泄漏

    c/c++的动态内存管理 new/delete opeartor new/delete placement-new 内存泄漏 c/c++的动态内存管理 在开始之前首先要了解c和c++的内存分布,我简单 ...

最新文章

  1. hadoop学习笔记2
  2. oracle adg 改密码,Oracle ADG数据库切换
  3. uboot中的mmc命令
  4. 苹果iPhone XI奋起直追?直接升级四摄镜头
  5. matlab 三维图像的绘制
  6. zookeeper分布式安装与配置
  7. (转)JavaScript事件冒泡简介及应用
  8. 21天学通c语言错误,为《21天学通C语言》(第7版)(Sams Teach Yourself C in 21 Days)正名...
  9. 空间四点定位原理及应用
  10. This experimental syntax requires enabling the parser plugin: ‘optionalChaining‘
  11. 云虚拟主机worldpress安装教程
  12. 深度神经网络的成功应用,深度神经网络技术赋能
  13. html中文字不自动换行 white-space style
  14. Absolutt ingenting er mye mer skjerpende parajumpers ? v?re en ulydig prest
  15. OOP和POP的区别
  16. java swing 网格布局
  17. 如何了解一个软件的设计?
  18. 如何应对学习知识、技能不用就会忘(节选自《穷查理宝典》第十一讲:人类误判心理学之不用就忘倾向)
  19. sift是图像匹配的非常经典的算法
  20. SAP入门 - 配置中文界面

热门文章

  1. 用matlab画汽车,用matlab绘制汽车的爬坡度图
  2. php个人支付宝收款链接,Andriod监听支付宝收款实现个人支付宝支付接口!附安卓App...
  3. 电脑蓝屏之NtpClient故障修复
  4. 信息收集之——子域信息
  5. ffmpeg下载直播流视频测试,2022.05可用
  6. Python 每日一题(一元二次方程求解)
  7. 用python提取不同的两列数据对比_比较两列数据fram中的值
  8. MySQL--入门篇:MySQL入门必会知识 Windows安装MySQL的zip包 一步一步带你图解安装MySQL过程 详细图解MySQL语句
  9. Ansys Zemax / SPEOS | 3片式LCD投影仪的设计与仿真
  10. c# 调用jtts_Intouch、Wonderware实现真人语音报警