C++ Allocator

C++ Allocator

该开始搞项目了,但是在搞项目之前,先搞一下C++的Allocator,因为项目中会用到。现在还不确定到底模仿哪个,jemalloc和tcmalloc,先看看吧。

1. 为什么需要Allocator

其实和new/delete是等价的,但是可以屏蔽一些底层细节,因为不一定所有平台都提供统一的内存分配方式,所以需要一个统一的接口,这个接口就是Allocator。在stl里面其实有大量使用。

另外allocator只是一片内存,而不是对象,所以需要配合construct和destroy来构造和析构对象。这个就解决了时间维度上的外部碎片。

过多的纠结为什么这个东西存在其实没啥意义。所以就不纠结了。

2. Allocator的接口

Allocator大概分为几个部分

  • 分配内存
  • 释放内存
  • 构造对象
  • 析构对象

每一步都有一个接口,这里就不一一列举了,可以参考stl的源码。

然后在我们实现allocator类的时候,需要实现这些接口,然后在自己的allocator中用。

3. 实现一个简单的Allocator

放链接:(tyallocator)[https://github.com/tiany7/tyallocator]

4. 一些问题

4.1 为什么需要rebind

因为在stl中,allocator是一个模板类,所以在使用的时候,需要指定一个类型,比如

std::vector<int, tyalloc::allocator<int>> v;

当使用Allocator为容器分配内存时,它可能需要为不同类型的元素分配不同大小的内存。rebind函数允许Allocator将自己转化为一个与给定类型相关的Allocator,以便为该类型的元素分配内存。rebind函数将Allocator类型参数转换为另一种类型参数,这个类型参数与需要分配内存的元素类型相同。这使得Allocator可以为不同类型的元素分配不同大小的内存,从而更好地支持STL容器的泛型性质。

4.2 为什么需要address和reference

address是返回一个指向对象的指针,reference是返回一个对象的引用。这两个函数是为了支持stl的迭代器,因为迭代器需要知道对象的地址和引用,也为移动等操作提供支持。

4.3 为什么需要const_iterator

因为stl的迭代器是支持const的,所以需要一个const_iterator。

4.4 为什么需要max_size

因为stl的容器需要知道最大的size,所以需要这个函数。

posted @ 2023-04-09 09:48  tiany7  阅读(71)  评论(0编辑  收藏  举报