资讯动态

【STL】头文件:<allocators>

发布时间:2026/10/15 18:28:31 来源:尧图企业网站定制
allocators 头文件定义多个模版用于基于节点的容器分配、释放内存块。目录1 说明2 接口2.1 宏Macros2.2 运算符Operators2.3 类列表Classes3 要求1 说明注意⚠️自 Visual Studio 2019 16.3 版本起allocators 已被标记为弃用deprecated。allocators 提供 6 个分配器模版为基于节点的容器选择内存管理策略。配套提供多种同步过滤器适配不同多线程模型也支持单线程无同步。开发者可以根据程序内存访问模式与同步需求选择对应的内存管理策略以此提升程序运行速度或者降低内存占用。分配器模版由可复用组件搭建组件支持自定义 / 替换以此扩展更多内存管理方案。C标准库基于节点的容器std::list、std::set、std::multiset、std::map、std::multimap。这类容器的元素单独存放在独立节点中同一容器类型的节点大小固定不需要通用内存管理器的复杂能力。因为内存块大小编译期即可确定内存管理器可以实现的更简单、更快。如果用于非节点型容器std::vector、std::deque、std::basic_string分配器模版虽然可以正常工作但相比默认分配器几乎无法带来性能提升。分配器是类模版用于管理指定类型对象/对象数组的内存分配与释放。标准库多个容器模版都会使用分配器对象。分配器通用模版形式templateclassTypeclassallocator;模版参数 Type 代表该分配器实例管理的类型。C标准库默认分配器 allocator定义在memory头文件。allocators 内置 6 种分配器allocator_newdelallocator_unboundedallocator_fixed_sizeallocator_variable_sizeallocator_suballocallocator_chunklist使用示例创建容器时把分配器作为第二个模版参数传入#includelist#includeallocators//使用 allocator_chunklist 默认同步过滤器分配节点std::listint,stdext::allocators::allocator_chunklistint_List0;使用宏 ALLOCATOR_DECL 创建带自定义同步过滤器的分配器模版_List1 使用 allocator_chunklist 与 sync_per_thread 同步过滤器分配节点。#includelist#includeallocators//创建使用 cache_chunklist、per-thread 同步策略的分配器 AllocALLOCATOR_DECL(CACHE_CHUNKLIST,stdext::allocators::sync_per_thread,Alloc);std::listint,allocint_List1;块分配器block allocator分为缓存cache与过滤器filter。缓存是类模版接收一个std::size_t参数实现固定大小内存块的分配释放。底层依赖operator new获取内存但不必每次分配都单独调用一次 operator new例如可以从一块大内存里子分配或者缓存已释放的内存块用于后续复用。若编译器不支持 rebind模版实例化时传入的 std::size_t 参数不一定等于缓存成员函数 allocate / deallocate 传入的 _Sz。allocators 提供的缓存模版cache_freelistcache_suballoccache_chunklist过滤器filter块分配器的一种内部借助另一个块分配器作为模版参数传入实现成员函数。最常见一类是同步过滤器施加同步策略控制对底层块分配器实例成员函数的并发访问。allocators 同步过滤器sync_none无同步sync_per_container每个分配器实例独立缓存sync_per_thread每个线程独立缓存sync_shared全局共享缓存互斥锁保护allocators 还提供rts_alloc过滤器内部持有多个块分配器实例运行时决定使用哪一个实例做分配 / 释放而非编译器确定。用于不支持 rebind 的编译器。同步策略控制分配器实例如何处理多线程同时发起的分配 / 释放请求。最简单策略请求直接透传给底层缓存由用户自行保证线程安全复杂策略使用互斥锁串行访问底层缓存。如果编译器同时支持单线程 / 多线程程序编译单线程程序默认同步过滤器为 sync_none其余场景默认 sync_shared。缓存模版cache_freelist需要一个max类参数用于限制空闲链表最多保存的元素数量。allocators 提供的 max 限制类max_none最大长度为0max_unbounded不限制空闲链表长度max_fixed_size固定最大长度max_variable_size最大长度随已分配块数量动态变化2 接口2.1 宏Macros宏说明ALLOCATOR_DECL生成一个分配器类模版CACHE_CHUNKLIST等价 stdext::allocators::cache_chunklistsizeof(Type)CACHE_FREELIST等价 stdext::allocators::cache_freelistsizeof(Type), maxCACHE_SUBALLOC等价 stdext::allocators::cache_suballocsizeof(Type)SYNC_DEFAULT生成默认同步过滤器2.2 运算符Operators运算符说明operator (allocators)判断两个同类型分配器对象是否相等operator ! (allocators)判断两个同类型分配器对象是否不等2.3 类列表Classes类说明allocator_base基类提供从同步过滤器构建自定义分配器所需的基础成员函数allocator_chunklist使用 cache_chunklist 缓存管理内存分配释放allocator_fixed_size基于 cache_freelist空闲链表上限由 max_fixed_size 控制allocator_newdel直接使用 operator new / operator delete 实现分配释放allocator_suballoc使用 cache_suballoc 缓存管理内存分配释放allocator_unbounded基于 cache_freelist空闲链表无上限max_unboundedallocator_variable_size基于 cache_freelist空闲链表上限动态变化max_variable_sizecache_chunklist固定大小内存块缓存分配器cache_freelist固定大小内存块缓存分配器基于空闲链表cache_suballoc固定大小内存块缓存分配器大块内存子分配freelist管理内存块空闲链表max_fixed_size限制空闲链表最大长度为固定值max_none空闲链表最大长度为 0max_unbounded不对空闲链表长度做限制max_variable_size空闲链表上限随已分配块数量动态调整rts_alloc运行时选择底层缓存实例适配无 rebind 编译器sync_none无同步保护的同步过滤器sync_per_container每个分配器对象拥有独立缓存sync_per_thread每个线程拥有独立缓存sync_shared所有分配器共享同一个缓存使用互斥锁保护并发访问3 要求头文件allocators命名空间stdext

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑