自定义自定义STL std :: allocator替换可提高性能替换可提高性能-源码源码
介绍介绍
这是我在Code Project上有关固定块内存分配器的第三篇也是最后一篇文章。 这次,我们将使用前两篇文章奠定的基础,创
建一个备用的C ++标准库std::allocator内存管理器。
标准模板库(STL)是功能强大的C ++软件库,包括容器和迭代器支持。 将库用于关键任务或时间紧迫项目的问题不在于
STL本身-该库非常强大。 相反,它是不受限制地使用全局堆的。 标准STL分配器在操作期间广泛使用堆。 这是资源受限的嵌
入式系统上的一个问题。 嵌入式设备可以运行数月或数年,必须防止堆碎片造成的故障。 幸运的是,STL提供了一种用我们
自己的设计替换std::allocator 。
固定的块内存分配器是一种提供类似动态操作的常用技术,但是从存储池中提供内存,在该存储池中,所分配的块具有固定大
小。 与全局堆不同,全局堆通常可以在任何大小的块上运行,而可以为狭窄的用途定制固定的块分配器。 固定块分配器还可
以提供一致的执行时间,而全局堆不能提供这种保证。
本文介绍了一种STL兼容的分配器实现,该实现依赖于固定的块分配器来分配和回收内存。 新的分配器可防止由碎片堆引起
的错误,并提供一致的分配/取消分配执行时间。
std :: allocator
STL std::allocator类提供默认的内存分配和释放策略。 如果检查容器类的代码,例如std::list ,则会看到默认的std::allocator模
板参数。 在这种情况下, allocator<_Ty>是处理_Ty对象的分配职责的模板类。
C ++
template<class _Ty, class _Ax = allocator<_Ty> >
class list : public _List_val<_Ty, _Ax>
{
// ...
}
由于模板参数_Ax默认为allocator<_Ty >,因此您可以创建列表对象而无需手动指定分配器。 如下所示声明myList会创建一个
分配器类,用于分配/取消分配int值。
C ++
std::list<int> myList;
STL容器依赖于动态内存来存储元素和节点。 元素是插入对象的大小。 在这种情况下, sizeof(int)是存储一个列表元素所需的
内存。 节点是将元素绑定在一起所需的内部结构。 对于std::list ,它是一个双向链接的列表,至少存储指向下一个和上一个节
点的指针。
当然,元素大小取决于存储的对象。 但是,节点大小也会根据所使用的容器而有所不同。 std::list节点的大小可能
与std::map节点的大小不同。 因此,STL分配器必须能够处理不同大小的内存块请求。
STL分配器必须遵守特定的接口要求。 这不是有关std::allocator API的方式和原因的文章-有许多在线参考文献比I更好地解释了
这一点。相反,我将重点介绍在现有内存中放置内存分配/取消分配调用的位置STL-allocator类接口,并提供所有常用容器的
新“ x”版本以简化用法。
xallocator
正如我的文章“ 用快速固定块内存分配器替换用快速固定块内存分配器替换malloc / free ”中所述,新的固定块STL分配器的大部分繁重工作都来自基
础xallocator 。 如标题所示,此模块将malloc / free替换为新的固定块xmalloc / xfree版本。
对用户而言,除了固定模块功能外,这些替换功能的操作方式与标准CRT版本相同。 简而言之, xallocator有两种操作模
式:
静态池
(从预先声明的静态内存中获取所有内存)或
堆块
(从全局堆中获取
块
,但在释放时回收以供以后使用)。 有关
实现的详细信息,请参见前面的文章。
stl_allocator
类stl_allocator是固定块STL兼容的实现。 此类用作std::allocator的替代方法。
C ++
template <typename T>
class stl_allocator
{
评论0