更好但标准库却不采用的alloc内存分配

现在标准库中容器分配的默认类都是

template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
    class vector : protected _Vector_base<_Tp, _Alloc>...

中的allocator类, 这样的类里面分配的内存空间每一个元素都要额外分配内存记录分配内存的大小以及元素所占的字节, 但是容器中的元素大小都是一样的, 因此这样子分配浪费许多空间.
之前在G2.9版本中的分配器采用了不同的分配方式:
在这里插入图片描述
其中的主要思想是:
#0#15的16个bit分别负责对应的字节大小, 比如#0中所指向的已分配的内存每一个都是8个字节, #7则是负责64个字节的大小, 以此类推. (十分具体的还得看侯捷老师的内存管理).

现在的标准库不使用这种方法, 但是还是有保留的, 在ext/pool_allocator.h中.
然后在__gnu_cxx命名空间中.

#include <vector>
#include <iostream>
#include <ext/pool_allocator.h>
using namespace std;
int main()
{
    vector<int, __gnu_cxx::__pool_alloc<int>> v = {1,2,3,4};
    for(auto e : v){
        cout << e << endl;
    }
    return 0;
}

输出:

1
2
3
4
好的,我会尽力回答你的问题。首先,我们需要了解一下内存分配的基本原理。在C语言中,内存分配通常使用malloc函数。它会在堆上分配一块指定大小的空间,并返回一个指针,指向这块空间的起始地址。 我们可以使用链表来实现一个简单的内存分配器。具体来说,我们可以将堆划分为多个固定大小的块,然后使用链表来管理这些块。 下面是一个简单的示例代码: ``` #include <stdio.h> #include <stdlib.h> // 定义一个内存块结构体 typedef struct block { int size; // 内存块大小 struct block* next; // 下一个内存块 } block_t; // 定义一个内存池结构体 typedef struct { block_t* head; // 内存块链表头 int block_size; // 内存块大小 int num_blocks; // 内存块数量 } mem_pool_t; // 初始化内存池 void mem_pool_init(mem_pool_t* pool, int block_size, int num_blocks) { int i; block_t *p, *q; // 分配内存池空间 pool->head = (block_t*)malloc(block_size * num_blocks); pool->block_size = block_size; pool->num_blocks = num_blocks; // 初始化内存块链表 p = pool->head; for (i = 0; i < num_blocks; i++) { p->size = block_size; q = p++; q->next = p; } q->next = NULL; } // 内存分配函数 void* mem_alloc(mem_pool_t* pool, int size) { block_t *p, *q; // 遍历内存块链表,寻找第一个大小足够的内存块 for (p = pool->head, q = NULL; p != NULL; q = p, p = p->next) { if (p->size >= size) { // 将找到的内存块从链表中移除 if (q == NULL) { pool->head = p->next; } else { q->next = p->next; } // 返回内存块指针 return (void*)p; } } // 没有找到合适的内存块 return NULL; } // 内存释放函数 void mem_free(mem_pool_t* pool, void* ptr) { block_t *p, *q; // 将被释放的内存块插入到内存块链表头部 p = (block_t*)ptr; for (q = pool->head; q != NULL && q < p; q = q->next) { if (q->next > p) { break; } } p->next = q->next; q->next = p; } // 测试代码 int main() { mem_pool_t pool; int i; void* ptr[10]; // 初始化内存池 mem_pool_init(&pool, sizeof(int), 10); // 分配内存块 for (i = 0; i < 10; i++) { ptr[i] = mem_alloc(&pool, sizeof(int)); *(int*)ptr[i] = i; } // 输出内存块内容 for (i = 0; i < 10; i++) { printf("%d ", *(int*)ptr[i]); } printf("\n"); // 释放内存块 for (i = 0; i < 10; i++) { mem_free(&pool, ptr[i]); } return 0; } ``` 在这个示例代码中,我们定义了一个内存块结构体,以及一个内存池结构体。内存池结构体包含一个内存块链表头,以及内存块大小和数量等信息。我们使用mem_pool_init函数来初始化内存池,使用mem_alloc函数来分配内存块,使用mem_free函数来释放内存块。在测试代码中,我们分配了10个int类型的内存块,并存储了它们的值,然后释放了这些内存块。 需要注意的是,这个示例代码只是一个简单的演示,实际的内存分配器需要考虑更多的因素,如内存对齐、内存碎片等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zedjay_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值