MtFmt 1.0.0
MtFmt is a format library on embed. system and wrote by pure C.
载入中...
搜索中...
未找到
结构体 | 宏定义 | 类型定义 | 函数 | 变量
mm_heap.c 文件参考

堆内存管理 更多...

#include "mm_heap.h"
#include <stddef.h>
#include <stdint.h>
#include <string.h>

结构体

struct  tagFreeBlock
 空闲块记录 更多...
 
struct  tagHeap
 堆管理器 更多...
 

宏定义

#define MSTR_IMP_SOURCES   1
 

类型定义

typedef usize_t heap_size_t
 堆的size
 
typedef struct tagFreeBlock FreeBlock
 空闲块记录
 
typedef struct tagHeap Heap
 堆管理器
 

函数

static uptr_t align_of (uptr_t beg, usize_t align)
 计算beg对齐到align字节的对齐地址
 
static void heap_free_impl (Heap *heap, void *mem)
 释放由堆分配器分配的内存
 
static void heap_init_impl (Heap *heap, uptr_t memory, usize_t memory_size)
 初始化堆
 
static void insert_free_block (const Heap *heap, FreeBlock *block)
 插入空闲块
 
static void insert_block_helper (const Heap *heap, FreeBlock *insert_pos, FreeBlock *insert_block)
 插入并尝试合并一个块
 
static FreeBlocksplit_free_block (FreeBlock *block, heap_size_t alloc_size)
 分割空闲块
 
static FreeBlockallocate_tactic (const Heap *heap, heap_size_t need_size)
 分配策略, 尝试找到 need_size 大小的 free block
 
static void * heap_allocate_impl (Heap *heap, heap_size_t need_size, heap_size_t align)
 在堆中分配内存
 
static void * heap_re_allocate_impl (Heap *heap, void *old_ptr, heap_size_t need_size, heap_size_t old_size)
 在堆中重新分配内存
 
 mstr_heap_init_sym (iptr_t heap_memory, usize_t heap_size)
 初始化堆分配器
 
 mstr_heap_allocate_sym (usize_t size, usize_t align)
 尝试从堆中分配size大小的内存
 
 mstr_heap_re_allocate_sym (void *old_ptr, usize_t new_size, usize_t old_size)
 尝试从堆中重新分配size大小的内存
 
 MSTR_EXPORT_API (void)
 翻转字符串
 
 MSTR_EXPORT_API (usize_t)
 取得自运行以来空闲内存最小的值
 
 mstr_heap_get_allocate_count (usize_t *alloc_count, usize_t *free_count)
 取得分配器的统计数据
 
 mstr_heap_realloc_cpimp_sym (void *old_ptr, usize_t new_size, usize_t old_size)
 由memcpy实现realloc
 

变量

static Heap global_heap
 全局的堆管理器
 

详细描述

堆内存管理

作者
向阳 (hinat.nosp@m.a.ho.nosp@m.shino.nosp@m.@fox.nosp@m.mail..nosp@m.com)
版本
1.0
日期
2023-04-22

宏定义说明

◆ MSTR_IMP_SOURCES

#define MSTR_IMP_SOURCES   1

类型定义说明

◆ FreeBlock

typedef struct tagFreeBlock FreeBlock

空闲块记录

◆ Heap

typedef struct tagHeap Heap

堆管理器

◆ heap_size_t

堆的size

函数说明

◆ align_of()

static uptr_t align_of ( uptr_t  beg,
usize_t  align 
)
static

计算beg对齐到align字节的对齐地址

参数
[in]beg起始地址
[in]align需要对齐的字节数, 必须是2的整数幂
返回
heap_size_t: 对齐后的地址

◆ allocate_tactic()

static FreeBlock * allocate_tactic ( const Heap heap,
heap_size_t  need_size 
)
static

分配策略, 尝试找到 need_size 大小的 free block

参数
heap
need_size需要的大小
返回
FreeBlock*: 找到的空闲块, 如果没有找到返回NULL

◆ heap_allocate_impl()

static void * heap_allocate_impl ( Heap heap,
heap_size_t  need_size,
heap_size_t  align 
)
static

在堆中分配内存

参数
[in,out]heap
[in]need_size需要分配的大小
[in]align要求的字节对齐
返回
void*: 内存区, 分配失败返回NULL

◆ heap_free_impl()

static void heap_free_impl ( Heap heap,
void *  mem 
)
static

释放由堆分配器分配的内存

参数
[in,out]heap
[in]mem需要释放的内存区

◆ heap_init_impl()

static void heap_init_impl ( Heap heap,
uptr_t  memory,
usize_t  memory_size 
)
static

初始化堆

参数
[out]heapheap结构
[in]memoryheap所占用的内存区
[in]memory_sizeheap所占用的内存区大小

◆ heap_re_allocate_impl()

static void * heap_re_allocate_impl ( Heap heap,
void *  old_ptr,
heap_size_t  need_size,
heap_size_t  old_size 
)
static

在堆中重新分配内存

参数
[in,out]heap
[in]old_ptr以前的指针
[in]need_size需要分配的大小
[in]old_size以前的内存区大小, 可能用于数据拷贝
返回
void*: 内存区, 分配失败返回NULL

◆ insert_block_helper()

static void insert_block_helper ( const Heap heap,
FreeBlock insert_pos,
FreeBlock insert_block 
)
static

插入并尝试合并一个块

◆ insert_free_block()

static void insert_free_block ( const Heap heap,
FreeBlock block 
)
static

插入空闲块

注解
该函数和 insert_block_helper 配合使用
参数
[in]heapheap
[in,out]block需要插入的空闲块

◆ MSTR_EXPORT_API() [1/2]

MSTR_EXPORT_API ( usize_t  )

取得自运行以来空闲内存最小的值

判断前导字符lead后面的字符长度, 前导字符包括在内

取得当前的空闲内存大小

◆ MSTR_EXPORT_API() [2/2]

MSTR_EXPORT_API ( void  )

翻转字符串

释放由 mstr_heap_allocate 分配的内存

释放一个字符串所占的内存

取得迭代器

翻转字符串, 不做任何其它处理

参数
[in,out]str需要翻转的字符串
[in,out]str需要翻转的字符串
注意
通常情况下不需要使用此函数, 此函数不会保证反转后的编码正确。它设计出来是为了给明确只有ASCII字符的字符串做翻转的, 在UTF-8编码下, 该函数可降低很多操作
参数
[out]it迭代器输出
[in]str原字符串
str字符串结构

◆ mstr_heap_allocate_sym()

mstr_heap_allocate_sym ( usize_t  size,
usize_t  align 
)

尝试从堆中分配size大小的内存

返回
void*: 分配结果, 如果分配失败返回NULL

◆ mstr_heap_get_allocate_count()

mstr_heap_get_allocate_count ( usize_t alloc_count,
usize_t free_count 
)

取得分配器的统计数据

参数
[out]alloc_count分配次数
[out]free_count释放次数

◆ mstr_heap_init_sym()

mstr_heap_init_sym ( iptr_t  heap_memory,
usize_t  heap_size 
)

初始化堆分配器

参数
[in]heap_memory堆内存区
[in]heap_size堆内存区的大小

◆ mstr_heap_re_allocate_sym()

mstr_heap_re_allocate_sym ( void *  old_ptr,
usize_t  new_size,
usize_t  old_size 
)

尝试从堆中重新分配size大小的内存

参数
[in]old_ptr之前的ptr
[in]new_size需要分配的新大小
[in]old_size之前的ptr的大小
返回
void*: 分配结果, 如果分配失败返回NULL

◆ mstr_heap_realloc_cpimp_sym()

mstr_heap_realloc_cpimp_sym ( void *  old_ptr,
usize_t  new_size,
usize_t  old_size 
)

由memcpy实现realloc

返回
void*: 分配结果, 如果分配失败返回NULL

◆ split_free_block()

static FreeBlock * split_free_block ( FreeBlock block,
heap_size_t  alloc_size 
)
static

分割空闲块

注解
从 block 前段划分出alloc_size大小的空间, 并返回划分后的新free block
参数
block需要划分的块
alloc_size分配大小
返回
FreeBlock*: 划分后的结果

变量说明

◆ global_heap

Heap global_heap
static

全局的堆管理器