記憶體分配 定長記憶體分配器

2021-10-25 13:12:07 字數 2037 閱讀 7950

在各種記憶體分配演算法中,有一種很實用,實現起來也簡單:定長的記憶體分配器。即每次分配的記憶體大小是固定的。

大概邏輯是:

在一些區域性的單執行緒邏輯中,可以有效提高效率。

**很短,很容易看懂:

fallocator.h

#pragma once

/** * 固定長度的記憶體分配器

*/#include #include #include // 記憶體項

typedef struct blockitem blockitem_t;

// 記憶體塊

typedef struct memblock memblock_t;

// 分配器

typedef struct fallocator fallocator_t;

// 初始化分配器: blocksize為記憶體塊的長度,itemsize為分配項的大小

void fallocator_init(fallocator_t *alloc, uint32_t blocksize, uint32_t itemsize);

// 釋放分配器

void fallocator_free(fallocator_t *alloc);

// 建立記憶體項

void* fallocator_newitem(fallocator_t *alloc);

// 釋放記憶體項

bool fallocator_freeitem(fallocator_t *alloc, void *item);

// 判斷記憶體項是否已經釋放

bool fallocator_isfree(fallocator_t *alloc, void *item);

fallocator.c

#include "fallocator.h"

#include #include #include #define max_block_size 16*1024

#define min_block_size 4096

#define min_item_size sizeof(blockitem_t)

#define min(a, b) ((a) > (b) ? (b) : (a))

#define max(a, b) ((a) > (b) ? (a) : (b))

#define clamp(v, mi, ma) max(min(v, ma), mi)

#define free_flag 0xc0c0c0c0

void fallocator_init(fallocator_t *alloc, uint32_t blocksize, uint32_t itemsize)

void fallocator_free(fallocator_t *alloc)

}void* fallocator_newitem(fallocator_t *alloc)

}blockitem_t *item = alloc->freeitem;

alloc->freeitem = alloc->freeitem->next;

return item;

}bool fallocator_freeitem(fallocator_t *alloc, void *item)

bool fallocator_isfree(fallocator_t *alloc, void *item)

下面是乙個測試程式:

#include #include "fallocator.h"

typedef struct myitem myitem_t;

static myitem_t* items[1000];

int main(int argc, char const *ar**)

for (i = 0; i < 500; ++i)

}for (i = 0; i < c; ++i)

fallocator_free(&alloc);

return 0;

}

記憶體分配器一

glibc記憶體管理學習 x86平台linux程序記憶體布局 text elf格式程式 data 程式執行時就能確定的資料,可讀可寫 bss 沒有初始化的全域性變數和靜態表裡 heap stack 由編譯器自動分配釋放,存放函式引數 區域性變數等 mmap 對映區域 實現乙個malloc 分頁與位址...

(六)記憶體分配器

c 的stl中定義了很多容器,容器的第二個模板引數通常為allocator型別。標準庫中allocator類定義在標頭檔案memory中,用於幫助將記憶體分配和物件的構造分離開來。它分配的記憶體是原始的 未構造的。allocatoralloc 定義了乙個可以分配string的allocator物件 ...

Halloc記憶體分配器

max nsbs 8192 預設的最大superblocks數量 sb set sz max nsbs word sz superblock set的大小,每個set32個superblcoks free mem g 裝置上釋放的總記憶體 max alloc mem g 可以被分配的最大記憶體 to...