分配器中的每对象数据

Per-object Data in Allocators?

本文关键字:对象 数据 分配器      更新时间:2023-10-16

什么是"分配器中的每个对象数据"。我似乎不明白这是什么意思。有人能很好地解释或链接这在c++语言中意味着什么吗?


第19.4.2节"c++程序设计语言(特别版)"第573页

同样,如果允许分配器是完全通用的,那么允许分配器分配任意类型元素的rebind机制就必须更加精细。因此,假定标准分配器不保存每个对象的数据,标准容器的实现可以利用这一点。"

单对象数据或局部状态指的是分配器类中的任何非静态数据成员。

问题是目前(在c++03中)不支持具有所谓本地状态的分配器。这通常被认为是当前c++中分配器模型的一个缺陷。

通读这篇详细介绍定制分配器设计的文章。Design下面的一段专门讨论了合并本地状态的分配器的一些缺陷。

简单地说,标准库中的一些操作目前要求特定类型的对象由分配器的一个实例安全地分配,然后由分配器的另一个实例安全地释放(当然,两个分配器是同一类型的!)例如,在实现list::splice时就可能出现这种情况。如果允许分配程序具有本地状态,这可能会变得棘手…

在即将到来的c++0x版本中,似乎将允许分配器合并本地状态,请查看这里的作用域分配器部分。

这仅仅意味着std::allocator<T>不包含任何每个实例的数据成员…它主要是内存分配和释放函数的包装器,还包含某些必需类型的定义,以及重新绑定现有分配器的机制,以便它可以分配不属于原始分配器模板实例化的类型。因此,基本上所说的是,如果有实际的私有数据成员必须管理,特别是考虑到STL分配器允许重新绑定的要求,这可能会使通用分配器的实现变得非常复杂,具体取决于这些每个实例的数据成员表示什么。