一个简单的内存分配算法

果然不到50行,果然可以在2小时上机写完,管然面试让15分钟写出来不过分
const int SEG_LEN = 128-4;
struct Mem_seg
{
    char mem [SEG_LEN];
    Mem_seg * next;
};

struct Mem_list
{
    Mem_list(Mem_seg *h, Mem_seg *e)
        :head(h),end(e)
    {
    }
    Mem_seg * head;
    Mem_seg * end;
};

Mem_list mem_init(char * all_mem, int free_size)
{
    int seg_num = free_size / SEG_LEN;
    for(int i=0;i<seg_num;++i)
        ((Mem_seg *)&all_mem[i * SEG_LEN])->next=(Mem_seg *)&all_mem[(i+1)*SEG_LEN];
    return Mem_list((Mem_seg *)all_mem,(Mem_seg *)&all_mem[seg_num * SEG_LEN]);
}
Mem_list mem_alloc(Mem_list &free_list, int size)
{
    int n=size/SEG_LEN;
    if(size > n * SEG_LEN)
        ++n;
    Mem_seg *phead=free_list.head;
    Mem_seg *pend=free_list.head;
    for(int i =0;i<n;i++)
        pend=pend->next;
    free_list.head=pend;
    return Mem_list(phead,pend);
}
int mem_free(Mem_list &free_list, Mem_list recycle_list)
{
    Mem_seg *ptemp=recycle_list.head;
    while(ptemp->next != recycle_list.end)
        ptemp=ptemp->next;
    ptemp->next=free_list.head;
    free_list.head=recycle_list.head;   
}
void test_list(Mem_list test_list)
{
    std::ofstream outfile;
    outfile.open("test.txt", std::ios::app);
    Mem_seg * phead = test_list.head;
    Mem_seg * pend = test_list.end;
    for(int i=0; phead != pend;phead=phead->next,i++)
        outfile<<i<<":"<<&(phead->mem)<<",/t";
    outfile<<std::endl;   
    outfile.close();
}
C++ 中内存分配主要涉及动态内存管理和堆(heap)内存管理。内存分配算法包括以下几种: 1. **首次适应(First-Fit)**:这是最简单内存分配策略,从内存空间的起始地址开始搜索,找到第一个足够大的空闲块来分配。如果所有块都小于请求的大小,则可能会导致内存碎片。 2. **最佳适应(Best-Fit)**:此策略寻找最适合当前请求大小的空闲块,即使这可能会使剩余的空间变得不连续。它更倾向于高效地使用内存,但可能会浪费一些小块。 3. **最差适应(Worst-Fit)**:与最佳适应相反,最差适应选择的是最不适合请求大小的空闲块,这样可能会导致大量的内存碎片。 4. **最小剩余适配(Next-Fit)**:类似于首次适应,但它每次分配后都会释放当前块后面的空闲区域,以便下次能分配到更小的块。 5. ** Buddy System(友元系统)**:这是一种用于内存管理的特殊技术,主要用于嵌入式系统和实时系统。它将大内存块分割成相同大小的小块,便于快速分配和回收。 6. **内存池(Memory Pool)**:预先为常见大小的内存分配创建预分配的内存池,加快了分配速度,减少了内存碎片。 7. ** slab allocator**:一种高效的内存分配器,用于管理小对象。它将内存分为若干个大小固定的slab,每个slab内的对象大小相同,减少了内存碎片。 这些算法中,现代操作系统和库(如C++标准库中的`new`和`delete`操作符)通常采用更复杂的混合策略,例如分代垃圾收集、内存池等,来提高性能和内存利用率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值