SGI

分配器

类别:分配器 组件类型:概述

摘要

分配器封装了内存的分配和释放。它们提供了一个低级接口,允许高效分配许多小对象;不同的分配器类型代表不同的内存管理方案。

请注意,分配器仅分配和释放内存,而不是创建和销毁对象。STL 还包含一些用于操作未初始化内存的低级算法。

另请注意,分配器不尝试封装多个内存模型。C++ 语言只定义了一个内存模型(例如,两个指针的差值始终为ptrdiff_t),并且此内存模型是分配器支持的唯一模型。这与原始 STL 中分配器的定义有很大不同。 [1]

描述

分配器接口的详细信息仍在发生变化,我们不保证特定成员函数将在未来版本中保留。您应该将分配器视为一个“黑盒”。也就是说,您可以通过使用特定分配器实例化容器模板来选择容器的内存分配策略 [2],但您不应对容器实际如何使用分配器做出任何假设。

可用的分配器如下。在大多数情况下,您不必担心这种区别:默认分配器,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>是不同的类型。

另请参阅


[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息