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,所以需要这个函数。