类别:分配器 | 组件类型:概述 |
请注意,分配器仅分配和释放内存,而不是创建和销毁对象。STL 还包含一些用于操作未初始化内存的低级算法。
另请注意,分配器不尝试封装多个内存模型。C++ 语言只定义了一个内存模型(例如,两个指针的差值始终为ptrdiff_t),并且此内存模型是分配器支持的唯一模型。这与原始 STL 中分配器的定义有很大不同。 [1]
可用的分配器如下。在大多数情况下,您不必担心这种区别:默认分配器,alloc,通常是最佳选择。
alloc | 默认分配器。它是线程安全的,通常具有最佳的性能特征。 |
pthread_alloc | 一个线程安全的分配器,它为每个线程使用不同的内存池;您只能使用pthread_alloc如果您的操作系统提供 pthreads。Pthread_alloc通常比alloc更快,尤其是在多处理器系统上。但是,它可能会导致资源碎片:在一个线程中释放的内存无法供其他线程使用。 |
single_client_alloc | 一个快速但非线程安全的分配器。在只有单个线程的程序中,此分配器可能比alloc. |
malloc_alloc | 一个简单地使用标准库函数的分配器malloc。它是线程安全的但速度慢;您有时可能想要使用它的主要原因是在调试时从边界检查或泄漏检测工具中获取更有用的信息。 |
vector<double> V(100, 5.0); // Uses the default allocator. vector<double, single_client_alloc> local(V.begin(), V.end());
[1] 进行此更改的原因是新接口减少了内存碎片,并且它允许同时高效且线程安全的实现。
[2] 不同的容器可以使用不同的分配器。例如,您可能有一些使用默认分配器的容器alloc以及其他使用pthread_alloc的容器。但是请注意,vector<int>和vector<int, pthread_alloc>是不同的类型。