**C++ STL中的空间配置器(Allocator)**是一种抽象组件,用于动态分配内存、管理内存池、分配内存、释放内存等操作。空间配置器是 STL 中非常重要的组件,它支持容器的内存分配和释放,同时也可以用于实现其他的内存管理功能。
简单地说就是为各个容器高效的管理空间 (空间的申请与回收) 的,在默默地工作。虽然在常规使用 STL 时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。
STL中的空间配置器使用模板类实现,定义在头文件 <memory> 中。默认情况下,STL 中的容器使用的是 std::allocator 空间配置器。当容器需要分配内存时,它会调用 std::allocator 的 allocate 函数来分配一块内存,并将指针返回给容器,容器在这块内存上构造对象。同样的,当容器需要释放内存时,它会调用 std::allocator 的deallocate函数来释放内存。
除了 std::allocator 之外,STL 中还有其他的空间配置器,如 std::allocator_traits、std::scoped_allocator_adaptor 等。这些空间配置器提供了更多的功能和灵活性,可以满足不同的需求。例如,std::allocator_traits 提供了一些辅助函数,可以帮助用户实现自己的空间配置器;std::scoped_allocator_adaptor 可以用于嵌套容器的内存分配,可以避免内存池的冲突问题。
总之,空间配置器是 STL 中非常重要的组件,它可以帮助我们实现内存管理,并提高程序的性能和可靠性。
Ⅱ. 为什么需要空间配置器❓❓❓
前面在模拟实现 vector、list、map、unordered_map 等容器时,所有需要空间的地方都是通过 new 申请的,虽然代码可以正常运行,但是有以下不足之处:
- 空间申请与释放需要用户自己管理,容易造成内存泄漏。
- 频繁向系统申请小块和不等大小的内存块,容易造成内存碎片。
- 频繁向系统申请小块内存,影响程序运行效率。
- 直接使用 malloc 与 new 进行申请,每块空间前有额外空间浪费。因为我们去申请多大的空间,必须要保存记录开辟内存块的大小,这样子才能保证在析构的时候释放正确大小的内存块。
- 申请空间失败怎么应对没有一个很好的解决方法。
- 代码结构比较混乱,代码复用率不高。
- 未考虑线程安全问题。
因此需要设计一块高效的内存管理机制,所以它的作用大概如下:
- **控制内存分配:**空间配置器可以控制内存分配的策略,如内存池的使用、对齐方式等,以满足不同的需求。通过使用空间配置器,我们可以更加细致地控制内存的分配方式,从而提高程序的性能和可靠性。
- **提高内存分配效率:**空间配置器可以重复利用已经分配过的内存,避免频繁地进行内存的分配和释放,从而提高内存分配的效率。特别是在需要频繁地创建和销毁对象的场景下,空间配置器的效果更加明显。
- **支持嵌套容器:**在 STL 中,容器可以嵌套使用,例如一个 vector 中包含若干个 list。这时如果每个容器都使用默认的空间配置器,可能会导致内存池的冲突问题,降低程序的性能。通过使用嵌套空间配置器,我们可以避免这个问题,提高程序的性能和可靠性。
- **支持自定义内存管理:**空间配置器可以用于实现自定义的内存管理,例如实现对象池、内存池等。通过自定义空间配置器,我们可以更加灵活地管理内存,提高程序的性能和可靠性。
- 引入了线程安全的空间配置器:** C++11引入了新的线程安全的空间配置器
std::scoped_allocator_adaptor**,它可以用于嵌套容器的内存分配,可以避免内存池的冲突问题。当然我们还可以通过使用std::mutex和std::atomic等库来保证线程安全!